diff --git a/ALL_VERSIONS b/ALL_VERSIONS index db1d06dcb452781e69835717d02407024fad37da..8a8ff94767995424b50f31dcd026971ae48a1dd3 100644 --- a/ALL_VERSIONS +++ b/ALL_VERSIONS @@ -1,5 +1,6 @@ Version number Date of release Notes ============== =============== ===== +27.1 (Cobalt) 2023, July, 18 27.0 (Cobalt) 2023, June, 15 26.1 (Iron) 2023, February 15 26.0 (Iron) 2022, November 23 diff --git a/Changelog b/Changelog index e619fceeedb77c384c4a7f965b2de3e7359104ff..c36ddded8499c474455030207e7d2a87ccbde633 100644 --- a/Changelog +++ b/Changelog @@ -18,6 +18,15 @@ Open Source Release <next-release> ############################################################################### +############################################################################### +Open Source Release 27.1 (Cobalt) +############################################################################### + +- Kernel [2023-07-17] New frama-c-script wrapper for make_machdep.py +-* Ivette [2023-07-06] Fixes crash with multiple instances +-* GUI [2023-07-05] Fixes freeze when a plugin aborts during splash screen +-* GUI [2023-07-05] Fixes crash related to tags and undefined types + ############################################################################### Open Source Release 27.0 (Cobalt) ############################################################################### diff --git a/VERSION b/VERSION index c49dfde59ea4943a4fad4f6f08b7c34f0d01e99d..fac6b38be1992b6403d0b57c5db9d59cb5284938 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -27.0+dev +27.1+dev diff --git a/bin/frama-c-script b/bin/frama-c-script index 669573f5394d1bcd7cae750123a17f013204fbc8..3e2bfc9335f779c6637a22db14df6c23ffad0c30 100755 --- a/bin/frama-c-script +++ b/bin/frama-c-script @@ -279,6 +279,11 @@ case "$command" in shift; ${FRAMAC_LIB}/analysis-scripts/creduce.sh "$@"; ;; + "make-machdep") + shift; + ${FRAMAC_LIB}/make_machdep/make_machdep.py \ + --machdep-schema ${FRAMAC_SHARE}/machdeps/machdep-schema.yaml "$@" + ;; *) echo "error: unrecognized command: $command"; exit 1 diff --git a/ivette/src/dome/main/dome.ts b/ivette/src/dome/main/dome.ts index 993f45c5bdd104cb3bbe59bad0220b97631643ca..fde22418299c5565e527a09fd89da3ff7a1edec8 100644 --- a/ivette/src/dome/main/dome.ts +++ b/ivette/src/dome/main/dome.ts @@ -483,18 +483,15 @@ function createBrowserWindow( theWindow.off('close', closeHandler); // Do not close the window yet event.preventDefault(); - + // Save state handle.frame = theWindow.getBounds(); handle.devtools = webContents.isDevToolsOpened(); - webContents.send('dome.ipc.closing'); + // Start closing process + webContents.send('dome.ipc.closing', wid); }; theWindow.on('close', closeHandler); - ipcMain.on('dome.ipc.closing.done', () => { - theWindow.close(); - }); - // Keep track of frame positions (in DEVEL) if (DEVEL) { const saveFrame = _.debounce(() => { @@ -509,6 +506,11 @@ function createBrowserWindow( return theWindow; } +ipcMain.on('dome.ipc.closing.done', (_event, wid:number) => { + const handle = WindowHandles.get(wid); + if (handle !== undefined) handle.window.close(); +}); + // -------------------------------------------------------------------------- // --- Application Window(s) & Command Line // -------------------------------------------------------------------------- diff --git a/ivette/src/dome/renderer/dome.tsx b/ivette/src/dome/renderer/dome.tsx index d05bbd025647811411d424b51848735991eb3992..07d8d0e2c23938c88e33202e92121b1f5ab03dcb 100644 --- a/ivette/src/dome/renderer/dome.tsx +++ b/ivette/src/dome/renderer/dome.tsx @@ -251,9 +251,9 @@ export const globalSettings = new Event(Settings.global); // --- Closing // -------------------------------------------------------------------------- -ipcRenderer.on('dome.ipc.closing', async () => { +ipcRenderer.on('dome.ipc.closing', async (_event, wid: number) => { await System.doExit(); - ipcRenderer.send('dome.ipc.closing.done'); + ipcRenderer.send('dome.ipc.closing.done', wid); }); /** Register a callback to be executed when the window is closing. */ diff --git a/nix/frama-c.nix b/nix/frama-c.nix index 34beab7c25ad1b93e0890ec9831a9b19430a5d17..4be82fb950a17b6a28b4a09c0c8834462f96c25d 100644 --- a/nix/frama-c.nix +++ b/nix/frama-c.nix @@ -44,6 +44,8 @@ , dos2unix , doxygen , python3 +, python3Packages +, yq , release_mode ? false }: @@ -103,6 +105,8 @@ stdenvNoCC.mkDerivation rec { dos2unix doxygen python3 + python3Packages.pyaml + yq ]; outputs = [ "out" "build_dir" ]; diff --git a/nix/internal-tests.nix b/nix/internal-tests.nix index 52dff2811552ecc25594c603eff9237dd47feeb5..bef1ffdc48e296581309ef715d9f971583fdf197 100644 --- a/nix/internal-tests.nix +++ b/nix/internal-tests.nix @@ -48,6 +48,8 @@ , perl , pkgs , python3 +, python3Packages +, yq , swiProlog , time , wp-cache @@ -109,6 +111,8 @@ stdenvNoCC.mkDerivation rec { perl pkgs.getopt python3 + python3Packages.pyaml + yq swiProlog time ]; diff --git a/opam b/opam index d25a560388ebc8ae749a5028643d90244bebb789..ca6dd2be800bbd63a8293969fa83286e14ba63db 100644 --- a/opam +++ b/opam @@ -1,7 +1,7 @@ opam-version: "2.0" name: "frama-c" synopsis: "Platform dedicated to the analysis of source code written in C" -version: "27.0+dev" +version: "27.1+dev" description:""" Frama-C gathers several analysis techniques in a single collaborative framework, based on analyzers (called "plug-ins") that can build upon the @@ -71,7 +71,7 @@ authors: [ homepage: "https://frama-c.com/" license: "LGPL-2.1-only" dev-repo: "git+https://git.frama-c.com/pub/frama-c.git" -doc: "http://frama-c.com/download/user-manual-27.0-Cobalt.pdf" +doc: "http://frama-c.com/download/user-manual-27.1-Cobalt.pdf" bug-reports: "https://git.frama-c.com/pub/frama-c/issues" tags: [ "deductive" @@ -99,7 +99,7 @@ build: [ install: [ [make - "PREFIX=%{prefix}%" "MANDIR=%{man}%" + "RELEASE=yes" "PREFIX=%{prefix}%" "MANDIR=%{man}%" "DOCDIR=%{doc}%" { with-doc } "install" ] diff --git a/releases/27.1.md b/releases/27.1.md new file mode 100644 index 0000000000000000000000000000000000000000..7c02e8a360357bbe63be5d2dd00dbee11ef1a4c1 --- /dev/null +++ b/releases/27.1.md @@ -0,0 +1,6 @@ +# Kernel +- Fixes a crash and a freeze in the GTK GUI +- Add a wrapper in `frama-c-script` pour `make_machdep.py` + +# Ivette +- Fixes a crash with multiple instances of Ivette diff --git a/share/dune b/share/dune index 77f771002d1b2e413dd411f13512b51fbf62f5b9..f00d3b92a5ed96459a035d8ca93acd082c366e9c 100644 --- a/share/dune +++ b/share/dune @@ -339,7 +339,9 @@ (machdeps/machdep_gcc_x86_32.yaml as share/machdeps/machdep_gcc_x86_32.yaml) (machdeps/machdep_gcc_x86_64.yaml as share/machdeps/machdep_gcc_x86_64.yaml) (machdeps/machdep_msvc_x86_64.yaml as share/machdeps/machdep_msvc_x86_64.yaml) - (machdeps/machdep_ppc_32.yaml as share/machdeps/machdep_ppc_32.yaml)) + (machdeps/machdep_ppc_32.yaml as share/machdeps/machdep_ppc_32.yaml) + (machdeps/machdep-schema.yaml as share/machdeps/machdep-schema.yaml) + ) ) ; machdep generation script @@ -368,9 +370,21 @@ (machdeps/make_machdep/alignof_str.c as lib/make_machdep/alignof_str.c) (machdeps/make_machdep/char_is_unsigned.c as lib/make_machdep/char_is_unsigned.c) (machdeps/make_machdep/const_string_literals.c as lib/make_machdep/const_string_literals.c) + (machdeps/make_machdep/errno.c as lib/make_machdep/errno.c) (machdeps/make_machdep/has__builtin_va_list.c as lib/make_machdep/has__builtin_va_list.c) + (machdeps/make_machdep/int_fast16_t.c as lib/make_machdep/int_fast16_t.c) + (machdeps/make_machdep/int_fast32_t.c as lib/make_machdep/int_fast32_t.c) + (machdeps/make_machdep/int_fast64_t.c as lib/make_machdep/int_fast64_t.c) + (machdeps/make_machdep/int_fast8_t.c as lib/make_machdep/int_fast8_t.c) + (machdeps/make_machdep/intptr_t.c as lib/make_machdep/intptr_t.c) + (machdeps/make_machdep/limits_macros.c as lib/make_machdep/limits_macros.c) (machdeps/make_machdep/little_endian.c as lib/make_machdep/little_endian.c) + (machdeps/make_machdep/make_machdep_common.h as lib/make_machdep/make_machdep_common.h) + (machdeps/make_machdep/nsig.c as lib/make_machdep/nsig.c) + (machdeps/make_machdep/posix_version.c as lib/make_machdep/posix_version.c) (machdeps/make_machdep/ptrdiff_t.c as lib/make_machdep/ptrdiff_t.c) + (machdeps/make_machdep/sanity_check.c as lib/make_machdep/sanity_check.c) + (machdeps/make_machdep/sig_atomic_t.c as lib/make_machdep/sig_atomic_t.c) (machdeps/make_machdep/sizeof_double.c as lib/make_machdep/sizeof_double.c) (machdeps/make_machdep/sizeof_float.c as lib/make_machdep/sizeof_float.c) (machdeps/make_machdep/sizeof_fun.c as lib/make_machdep/sizeof_fun.c) @@ -382,6 +396,17 @@ (machdeps/make_machdep/sizeof_short.c as lib/make_machdep/sizeof_short.c) (machdeps/make_machdep/sizeof_void.c as lib/make_machdep/sizeof_void.c) (machdeps/make_machdep/size_t.c as lib/make_machdep/size_t.c) + (machdeps/make_machdep/ssize_t.c as lib/make_machdep/ssize_t.c) + (machdeps/make_machdep/stdio_macros.c as lib/make_machdep/stdio_macros.c) + (machdeps/make_machdep/stdlib_macros.c as lib/make_machdep/stdlib_macros.c) + (machdeps/make_machdep/time_t.c as lib/make_machdep/time_t.c) + (machdeps/make_machdep/uint_fast16_t.c as lib/make_machdep/uint_fast16_t.c) + (machdeps/make_machdep/uint_fast32_t.c as lib/make_machdep/uint_fast32_t.c) + (machdeps/make_machdep/uint_fast64_t.c as lib/make_machdep/uint_fast64_t.c) + (machdeps/make_machdep/uint_fast8_t.c as lib/make_machdep/uint_fast8_t.c) + (machdeps/make_machdep/uintptr_t.c as lib/make_machdep/uintptr_t.c) (machdeps/make_machdep/wchar_t.c as lib/make_machdep/wchar_t.c) - (machdeps/make_machdep/make_machdep_common.h as lib/make_machdep/make_machdep_common.h) + (machdeps/make_machdep/weof.c as lib/make_machdep/weof.c) + (machdeps/make_machdep/wint_t.c as lib/make_machdep/wint_t.c) + (machdeps/make_machdep/wordsize.c as lib/make_machdep/wordsize.c) )) diff --git a/share/machdeps/machdep_avr_16.yaml b/share/machdeps/machdep_avr_16.yaml index f5ee3f6c8487f9c21f3de15a75d7255d4ff617d8..055d78e85c3d33563175e3c2c5f2e8d3c2508b8a 100644 --- a/share/machdeps/machdep_avr_16.yaml +++ b/share/machdeps/machdep_avr_16.yaml @@ -16,6 +16,7 @@ cpp_arch_flags: - -target - avr - -m16 +- -mmcu=atmega16 custom_defs: | #undef AVR #define AVR 1 @@ -33,6 +34,8 @@ custom_defs: | #define __ATOMIC_SEQ_CST 5 #undef __AVR #define __AVR 1 + #undef __AVR_ATmega16__ + #define __AVR_ATmega16__ 1 #undef __AVR__ #define __AVR__ 1 #undef __BIGGEST_ALIGNMENT__ @@ -645,6 +648,8 @@ custom_defs: | #define __clang_version__ "15.0.7 " #undef __clang_wide_literal_encoding__ #define __clang_wide_literal_encoding__ "UTF-16" + #undef __flash + #define __flash __attribute__((address_space(1))) #undef __llvm__ #define __llvm__ 1 eof: (-1) diff --git a/share/machdeps/machdep_avr_8.yaml b/share/machdeps/machdep_avr_8.yaml index 9a9268a4d5590425281b29da80561ab9d037b8cd..cbaeb67bbd3b9626e1cba28f416efded67c9cd79 100644 --- a/share/machdeps/machdep_avr_8.yaml +++ b/share/machdeps/machdep_avr_8.yaml @@ -15,6 +15,7 @@ compiler: clang cpp_arch_flags: - -target - avr +- -mmcu=atmega8 custom_defs: | #undef AVR #define AVR 1 @@ -32,6 +33,8 @@ custom_defs: | #define __ATOMIC_SEQ_CST 5 #undef __AVR #define __AVR 1 + #undef __AVR_ATmega8__ + #define __AVR_ATmega8__ 1 #undef __AVR__ #define __AVR__ 1 #undef __BIGGEST_ALIGNMENT__ @@ -644,6 +647,8 @@ custom_defs: | #define __clang_version__ "15.0.7 " #undef __clang_wide_literal_encoding__ #define __clang_wide_literal_encoding__ "UTF-16" + #undef __flash + #define __flash __attribute__((address_space(1))) #undef __llvm__ #define __llvm__ 1 eof: (-1) diff --git a/share/machdeps/make_machdep/make_machdep.py b/share/machdeps/make_machdep/make_machdep.py index bd0b6cefa82eeebfdbf575326681d26122018c34..c6045ab856a81cc991fbda527d32ca5648914719 100755 --- a/share/machdeps/make_machdep/make_machdep.py +++ b/share/machdeps/make_machdep/make_machdep.py @@ -49,8 +49,6 @@ from yaml.representer import Representer my_path = Path(sys.argv[0]).parent -logging.basicConfig(format="%(levelname)s: %(message)s") - parser = argparse.ArgumentParser(prog="make_machdep") parser.add_argument("-v", "--verbose", action="store_true") parser.add_argument("-o", type=argparse.FileType("w"), dest="dest_file") @@ -61,6 +59,12 @@ parser.add_argument( help="option to pass to the compiler to obtain its version; default is --version", ) +parser.add_argument( + "--machdep-schema", + default="machdep-schema.yaml", + help="location of the schema file describing a machdep; default is 'machdep-schema.yaml'", +) + parser.add_argument( "--from-file", help="reads compiler and arch flags from existing yaml file. Use -i to update it in place", @@ -98,6 +102,11 @@ parser.add_argument( args, other_args = parser.parse_known_args() +if args.verbose: + logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.INFO) +else: + logging.basicConfig(format="%(levelname)s: %(message)s") + if not args.compiler_flags: args.compiler_flags = ["-c"] @@ -106,8 +115,7 @@ if not args.cpp_arch_flags: def make_schema(): - schema_filename = my_path.parent / "machdep-schema.yaml" - with open(schema_filename, "r") as schema: + with open(args.machdep_schema, "r") as schema: return yaml.safe_load(schema) @@ -275,11 +283,9 @@ def find_value(name, typ, output): machdep[name] = value else: logging.warning( - f"cannot find value of field '{name}', using default value: '{default}'" + f"cannot find value of field '{name}', using default value: '{default}'\ncompiler output is:\n{output}" ) machdep[name] = default - if args.verbose: - print(f"compiler output is:{output}") else: logging.warning(f"unexpected symbol '{name}', ignoring") @@ -331,9 +337,9 @@ for f, typ in source_files: continue if typ == "macro": if proc.returncode != 0: - logging.warning(f"error in preprocessing value '{p}', some values won't be filled") - if args.verbose: - print(f"compiler output is:{proc.stderr.decode()}") + logging.warning( + f"error in preprocessing value '{p}', some values won't be filled\ncompiler output is:\n{proc.stderr.decode()}" + ) name = p.stem if name in machdep: machdep[name] = "" @@ -343,9 +349,9 @@ for f, typ in source_files: if typ == "macrolist": name = p.stem if proc.returncode != 0: - logging.warning(f"error in preprocessing value '{p}', some value might not be filled") - if args.verbose: - print(f"compiler output is:{proc.stderr.decode()}") + logging.warning( + f"error in preprocessing value '{p}', some values might not be filled\ncompiler output is:{proc.stderr.decode()}" + ) if name in machdep: machdep[name] = {} continue @@ -416,9 +422,7 @@ if proc.returncode == 0: lines += f"{line.strip()}\n" machdep["custom_defs"] = custom_defs(lines) else: - logging.warning("could not determine predefined macros") - if args.verbose: - print(f"compiler output is:{proc.stderr}") + logging.warning(f"could not determine predefined macros. compiler output is:\n{proc.stderr}") if args.from_file and args.in_place: machdep["machdep_name"] = Path(args.from_file).stem diff --git a/src/kernel_services/ast_printing/printer_tag.ml b/src/kernel_services/ast_printing/printer_tag.ml index dc3f0d40495c6ad04ec9a4d9a40aa80e5b1dc3f0..ffe3da9c20d58e47a2f9e218a137a49a616aa47e 100644 --- a/src/kernel_services/ast_printing/printer_tag.ml +++ b/src/kernel_services/ast_printing/printer_tag.ml @@ -840,19 +840,25 @@ struct super#fkind c method! compname fmt comp = - Format.fprintf fmt "@{<%s>%a@}" - (Info.tag (PGlobal(Globals.Types.global Struct comp.cname))) - super#compname comp + try + Format.fprintf fmt "@{<%s>%a@}" + (Info.tag (PGlobal(Globals.Types.global Struct comp.cname))) + super#compname comp + with Not_found -> super#compname fmt comp method! enuminfo fmt enum = - Format.fprintf fmt "@{<%s>%a@}" - (Info.tag (PGlobal(Globals.Types.global Enum enum.ename))) - super#enuminfo enum + try + Format.fprintf fmt "@{<%s>%a@}" + (Info.tag (PGlobal(Globals.Types.global Enum enum.ename))) + super#enuminfo enum + with Not_found -> super#enuminfo fmt enum method! typeinfo fmt tinfo = - Format.fprintf fmt "@{<%s>%a@}" - (Info.tag (PGlobal(Globals.Types.global Typedef tinfo.tname))) - super#typeinfo tinfo + try + Format.fprintf fmt "@{<%s>%a@}" + (Info.tag (PGlobal(Globals.Types.global Typedef tinfo.tname))) + super#typeinfo tinfo + with Not_found -> super#typeinfo fmt tinfo initializer force_brace <- true diff --git a/src/plugins/e-acsl/doc/Changelog b/src/plugins/e-acsl/doc/Changelog index 8d365c6d4a829724b44bdaac91bb6c491d01fb05..d0829960b6f98351aafa8264a28f34ae5934c948 100644 --- a/src/plugins/e-acsl/doc/Changelog +++ b/src/plugins/e-acsl/doc/Changelog @@ -25,6 +25,10 @@ Plugin E-ACSL <next-release> ############################################################################### +############################################################################### +Plugin E-ACSL 27.1 (Cobalt) +############################################################################### + ############################################################################### Plugin E-ACSL 27.0 (Cobalt) ############################################################################### diff --git a/src/plugins/e-acsl/tests/builtin/dune b/src/plugins/e-acsl/tests/builtin/dune index 9dbf4e24533a7de7d1e1946bcef58497e1507f23..60c73d79b871aac38f96989e746ac1ce4757a8b0 100644 --- a/src/plugins/e-acsl/tests/builtin/dune +++ b/src/plugins/e-acsl/tests/builtin/dune @@ -1,7 +1,7 @@ (subdir result/utils - (copy_files ../../utils/*)) + (copy_files ../../../utils/*)) (subdir result_dev/utils - (copy_files ../../utils/*)) + (copy_files ../../../utils/*)) diff --git a/src/plugins/e-acsl/tests/builtin/utils b/src/plugins/e-acsl/tests/builtin/utils deleted file mode 120000 index 19985ba50b51e1b7741a400a0b24ee16739553af..0000000000000000000000000000000000000000 --- a/src/plugins/e-acsl/tests/builtin/utils +++ /dev/null @@ -1 +0,0 @@ -../utils/ \ No newline at end of file diff --git a/src/plugins/e-acsl/tests/format/dune b/src/plugins/e-acsl/tests/format/dune index 9dbf4e24533a7de7d1e1946bcef58497e1507f23..60c73d79b871aac38f96989e746ac1ce4757a8b0 100644 --- a/src/plugins/e-acsl/tests/format/dune +++ b/src/plugins/e-acsl/tests/format/dune @@ -1,7 +1,7 @@ (subdir result/utils - (copy_files ../../utils/*)) + (copy_files ../../../utils/*)) (subdir result_dev/utils - (copy_files ../../utils/*)) + (copy_files ../../../utils/*)) diff --git a/src/plugins/e-acsl/tests/format/utils b/src/plugins/e-acsl/tests/format/utils deleted file mode 120000 index 19985ba50b51e1b7741a400a0b24ee16739553af..0000000000000000000000000000000000000000 --- a/src/plugins/e-acsl/tests/format/utils +++ /dev/null @@ -1 +0,0 @@ -../utils/ \ No newline at end of file diff --git a/src/plugins/gui/design.ml b/src/plugins/gui/design.ml index d9e13758325b50ceeb393c0d654d61e97542e8bb..2442eb86f7141a0e31f1af8e7d7047843abaa5d5 100644 --- a/src/plugins/gui/design.ml +++ b/src/plugins/gui/design.ml @@ -1891,27 +1891,26 @@ let toplevel play = let error_manager = new Gtk_helper.error_manager (splash_w:>GWindow.window_skel) in - let init_crashed = ref true in + let init_crash = ref None in error_manager#protect ~cancelable:true ~parent:(splash_w:>GWindow.window_skel) (fun () -> - (try - play (); - (* This is a good point to start using real asynchronous tasks - management: plug-ins launched from command line have finished - their asynchronous tasks thanks to the default Task.on_idle. *) - Task.on_idle := - (fun f -> ignore (Glib.Timeout.add ~ms:50 ~callback:f)); - let project_name = Gui_parameters.Project_name.get () in - if project_name = "" then - Project.set_current_as_last_created () - else - Project.set_current (Project.from_unique_name project_name); - Ast.compute () - with e -> (* An error occurred: we need to enforce the splash screen - realization before we create the error dialog widget.*) - force_s (); raise e); - init_crashed := false); + try + play (); + (* This is a good point to start using real asynchronous tasks + management: plug-ins launched from command line have finished + their asynchronous tasks thanks to the default Task.on_idle. *) + Task.on_idle := + (fun f -> ignore (Glib.Timeout.add ~ms:50 ~callback:f)); + let project_name = Gui_parameters.Project_name.get () in + if project_name = "" then + Project.set_current_as_last_created () + else + Project.set_current (Project.from_unique_name project_name); + Ast.compute () + with e -> (* An error occurred: we need to enforce the splash screen + realization before we create the error dialog widget.*) + force_s (); init_crash := Some e; raise e); if Ast.is_computed () then (* if the ast has parsed, but a plugin has crashed, we display the gui *) error_manager#protect ~cancelable:false @@ -1921,18 +1920,18 @@ let toplevel play = Glib.Timeout.remove tid; reparent_console main_ui#lower_notebook; splash_w#destroy (); - (* Display the console if a crash has occurred. Otherwise, display - the information panel *) - if !init_crashed then - (main_ui#lower_notebook#goto_page 2; - (* BY TODO: this should scroll to the end of the console. It - does not work at all after the reparent, and only partially - before (scrollbar is wrong) *) - let end_console = splash_out#buffer#end_iter in - ignore (splash_out#scroll_to_iter ~yalign:0. end_console) - ) - else - main_ui#lower_notebook#goto_page 0 + (* Display the console and an error dialog if a crash has occurred. + Otherwise, display the information panel. *) + match !init_crash with + | None -> main_ui#lower_notebook#goto_page 0 + | Some e -> + main_ui#lower_notebook#goto_page 2; + (* BY TODO: this should scroll to the end of the console. It + does not work at all after the reparent, and only partially + before (scrollbar is wrong) *) + let end_console = splash_out#buffer#end_iter in + ignore (splash_out#scroll_to_iter ~yalign:0. end_console); + error_manager#error ~reset:true "%s" (Cmdline.protect e); ) in ignore (Glib.Idle.add (fun () -> in_idle (); false)); diff --git a/src/plugins/gui/gtk_helper.ml b/src/plugins/gui/gtk_helper.ml index fd6b8762e486ad03c124f332b8acad806992cfb7..7ca273c4caa42910c0f3909f27ce949ff3eaadcf 100644 --- a/src/plugins/gui/gtk_helper.ml +++ b/src/plugins/gui/gtk_helper.ml @@ -738,6 +738,7 @@ class error_manager ?reset (o_parent:GWindow.window_skel) : host = ~title:"Error" ~position:`CENTER_ALWAYS ~modal:true + ~destroy_with_parent:true () in ignore (w#connect#response ~callback:(fun _ -> w#destroy ())); diff --git a/src/plugins/wp/Changelog b/src/plugins/wp/Changelog index e5014c708ca44c9f13901cc81eb4f44c82067707..ffb6adc03608fee48db598b77fe3a7e3ba00fb84 100644 --- a/src/plugins/wp/Changelog +++ b/src/plugins/wp/Changelog @@ -36,6 +36,10 @@ Plugin WP <next-release> - WP [2023-06-05] ACSL extension 'strategy' for proof strategies - WP [2023-06-05] ACSL extension 'proof' for proof resolution hints +############################################################################### +Plugin WP 27.1 (Cobalt) +############################################################################### + ############################################################################### Plugin WP 27.0 (Cobalt) ############################################################################### diff --git a/tests/fc_script/oracle/custom_machdep.yaml b/tests/fc_script/oracle/custom_machdep.yaml new file mode 100644 index 0000000000000000000000000000000000000000..24f472d19e21723c8f7bf328c8ff0a0bea41a373 --- /dev/null +++ b/tests/fc_script/oracle/custom_machdep.yaml @@ -0,0 +1,183 @@ +alignof_aligned: 16 +alignof_double: 8 +alignof_float: 4 +alignof_fun: 4 +alignof_int: 4 +alignof_long: 8 +alignof_longdouble: 16 +alignof_longlong: 8 +alignof_ptr: 8 +alignof_short: 2 +alignof_str: 1 +bufsiz: '8192' +char_is_unsigned: false +compiler: clang +cpp_arch_flags: + - --target=x86_64 +eof: (-1) +errno: + e2big: '7' + eacces: '13' + eaddrinuse: '98' + eaddrnotavail: '99' + eafnosupport: '97' + eagain: '11' + ealready: '114' + ebade: '52' + ebadf: '9' + ebadfd: '77' + ebadmsg: '74' + ebadr: '53' + ebadrqc: '56' + ebadslt: '57' + ebusy: '16' + ecanceled: '125' + echild: '10' + echrng: '44' + ecomm: '70' + econnaborted: '103' + econnrefused: '111' + econnreset: '104' + edeadlk: '35' + edeadlock: '35' + edestaddrreq: '89' + edom: '33' + edquot: '122' + eexist: '17' + efault: '14' + efbig: '27' + ehostdown: '112' + ehostunreach: '113' + eidrm: '43' + eilseq: '84' + einprogress: '115' + eintr: '4' + einval: '22' + eio: '5' + eisconn: '106' + eisdir: '21' + eisnam: '120' + ekeyexpired: '127' + ekeyrejected: '129' + ekeyrevoked: '128' + el2hlt: '51' + el2nsync: '45' + el3hlt: '46' + el3rst: '47' + elibacc: '79' + elibbad: '80' + elibexec: '83' + elibmax: '82' + elibscn: '81' + eloop: '40' + emediumtype: '124' + emfile: '24' + emlink: '31' + emsgsize: '90' + emultihop: '72' + enametoolong: '36' + enetdown: '100' + enetreset: '102' + enetunreach: '101' + enfile: '23' + enobufs: '105' + enodata: '61' + enodev: '19' + enoent: '2' + enoexec: '8' + enokey: '126' + enolck: '37' + enolink: '67' + enomedium: '123' + enomem: '12' + enomsg: '42' + enonet: '64' + enopkg: '65' + enoprotoopt: '92' + enospc: '28' + enosr: '63' + enostr: '60' + enosys: '38' + enotblk: '15' + enotconn: '107' + enotdir: '20' + enotempty: '39' + enotrecoverable: '131' + enotsock: '88' + enotsup: '95' + enotty: '25' + enotuniq: '76' + enxio: '6' + eopnotsupp: '95' + eoverflow: '75' + eownerdead: '130' + eperm: '1' + epfnosupport: '96' + epipe: '32' + eproto: '71' + eprotonosupport: '93' + eprototype: '91' + erange: '34' + eremchg: '78' + eremote: '66' + eremoteio: '121' + erestart: '85' + erofs: '30' + eshutdown: '108' + esocktnosupport: '94' + espipe: '29' + esrch: '3' + estale: '116' + estrpipe: '86' + etime: '62' + etimedout: '110' + etxtbsy: '26' + euclean: '117' + eunatch: '49' + eusers: '87' + ewouldblock: '11' + exdev: '18' + exfull: '54' +filename_max: '4096' +fopen_max: '16' +has__builtin_va_list: true +host_name_max: '64' +int_fast16_t: long +int_fast32_t: long +int_fast64_t: long +int_fast8_t: signed char +intptr_t: long +l_tmpnam: '20' +little_endian: true +machdep_name: anonymous_machdep +mb_cur_max: ((size_t)16) +nsig: (64 + 1) +path_max: '4096' +posix_version: 200809L +ptrdiff_t: long +rand_max: '2147483647' +sig_atomic_t: int +size_t: unsigned long +sizeof_double: 8 +sizeof_float: 4 +sizeof_fun: 1 +sizeof_int: 4 +sizeof_long: 8 +sizeof_longdouble: 16 +sizeof_longlong: 8 +sizeof_ptr: 8 +sizeof_short: 2 +sizeof_void: 1 +ssize_t: long +time_t: long +tmp_max: '238328' +tty_name_max: '32' +uint_fast16_t: unsigned long +uint_fast32_t: unsigned long +uint_fast64_t: unsigned long +uint_fast8_t: unsigned char +uintptr_t: unsigned long +wchar_t: int +weof: (0xffffffffu) +wint_t: int +wordsize: '64' diff --git a/tests/fc_script/oracle/find_fun1.res b/tests/fc_script/oracle/find_fun1.res index 58bf804e3c123e33f21c6761b63dcefa26e2e129..71eea9bdef1d36da92d821b392155e03e811c21e 100644 --- a/tests/fc_script/oracle/find_fun1.res +++ b/tests/fc_script/oracle/find_fun1.res @@ -1,4 +1,4 @@ -Looking for 'main2' inside 15 file(s)... +Looking for 'main2' inside 16 file(s)... Possible declarations for function 'main2' in the following file(s): for-find-fun.c Possible definitions for function 'main2' in the following file(s): diff --git a/tests/fc_script/oracle/find_fun2.res b/tests/fc_script/oracle/find_fun2.res index d868795ee4e11b8858e75185cfd91d68ea8a24e7..5c9b9b69b9d58907335997f8db1b440930ca63ef 100644 --- a/tests/fc_script/oracle/find_fun2.res +++ b/tests/fc_script/oracle/find_fun2.res @@ -1,4 +1,4 @@ -Looking for 'main3' inside 15 file(s)... +Looking for 'main3' inside 16 file(s)... Possible declarations for function 'main3' in the following file(s): for-find-fun2.c Possible definitions for function 'main3' in the following file(s): diff --git a/tests/fc_script/oracle/find_fun3.res b/tests/fc_script/oracle/find_fun3.res index 00f4bbc10eab9c20620426e670d9d0cf6b715762..67c26fc2681fd115eaca995ff472d4419c48248a 100644 --- a/tests/fc_script/oracle/find_fun3.res +++ b/tests/fc_script/oracle/find_fun3.res @@ -1,2 +1,2 @@ -Looking for 'false_positive' inside 15 file(s)... +Looking for 'false_positive' inside 16 file(s)... No declaration/definition found for function 'false_positive' diff --git a/tests/fc_script/oracle/make_machdep.err.log b/tests/fc_script/oracle/make_machdep.err.log new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/fc_script/test_machdep.i b/tests/fc_script/test_machdep.i new file mode 100644 index 0000000000000000000000000000000000000000..923485dde8e59c0631db3e506d95a6c23cf4699b --- /dev/null +++ b/tests/fc_script/test_machdep.i @@ -0,0 +1,12 @@ +/* run.config + NOFRAMAC: Just test the generation of a custom machdep with the installed script. + COMMENT: No C code gets analyzed there. File is empty on purpose + COMMENT: be sure to keep the first EXECNOW: it ensures + COMMENT: that dune will copy the file regardless of the environment + COMMENT: so that other tests whose oracles depend on the number of file in + COMMENT: the directory will be stable. + EXECNOW: LOG empty.res touch empty.res + ENABLED_IF: (and %{bin-available:clang} %{bin-available:yq}) + FILTER: sed -e '/^version:/d' + EXECNOW: LOG custom_machdep.yaml LOG make_machdep.err.log PTESTS_TESTING=1 %{bin:frama-c-script} make-machdep --compiler clang --cpp-arch-flags='--target=x86_64' | yq -Y 'del(.version)|del(.custom_defs)' > custom_machdep.yaml 2> make_machdep.err.log +*/ diff --git a/tools/hdrck/frama-c-hdrck.opam b/tools/hdrck/frama-c-hdrck.opam index acd43dffc4a7122b1a70a7ed71d9f1d2835a920b..f536d2fc26c201858ee02052f6b7c5d88a5673ce 100644 --- a/tools/hdrck/frama-c-hdrck.opam +++ b/tools/hdrck/frama-c-hdrck.opam @@ -1,7 +1,7 @@ opam-version: "2.0" name: "frama-c-hdrck" synopsis: "Frama-C header check tool" -version: "27.0+dev" +version: "27.1+dev" description:""" Performs all checks related to file headers as required by the Frama-C continuous integration. diff --git a/tools/lint/frama-c-lint.opam b/tools/lint/frama-c-lint.opam index 08041265966df4bcb34b87e4a768a7faad40342b..8b70df8d1ef65a0b9e546f58f3c42090dbe48ba0 100644 --- a/tools/lint/frama-c-lint.opam +++ b/tools/lint/frama-c-lint.opam @@ -1,7 +1,7 @@ opam-version: "2.0" name: "frama-c-lint" synopsis: "Frama-C lint tool" -version: "27.0+dev" +version: "27.1+dev" description:""" Performs all checks related to source code formatting as required by the Frama-C continuous integration. Namely: OCP-indent for ML files, clang-format for E-ACSL diff --git a/tools/ptests/ptests.ml b/tools/ptests/ptests.ml index 81a1426372abc479d2d2c085b661c4746869e4f4..4d1178925e63237b512ff43158d4324c99ae0070 100644 --- a/tools/ptests/ptests.ml +++ b/tools/ptests/ptests.ml @@ -1977,11 +1977,15 @@ let warn_if_not_enabled = let dune_cond_regexp = Str.regexp "^(\\(.*\\))" in let doublequote_regexp = Str.regexp "\"" in let dune_var_regexp = Str.regexp "%{" in + let paren_regexp = Str.regexp "[()]" in let dune_cond_item s = Str.global_replace dune_cond_regexp "\\1" s in let escaped_cond s = let s = Str.global_replace dune_var_regexp "\\%{" s in Str.global_replace doublequote_regexp "\\\"" s in + let safe_cond s = + Str.global_replace paren_regexp "\"\\0\"" s + in fun ~env ~suite fmt enabled_if -> if not (StringSet.is_empty enabled_if) then begin Format.fprintf fmt @@ -2000,7 +2004,7 @@ let warn_if_not_enabled = let pp_enabled fmt cond = let cond = dune_cond_item cond in Format.fprintf fmt " (echo \"- %s: \" %s \"\\n\")\n " - (escaped_cond cond) cond + (escaped_cond cond) (safe_cond cond) in let conds = StringSet.elements enabled_if in Format.fprintf fmt diff --git a/tools/ptests/wtests.ml b/tools/ptests/wtests.ml index 9d4d84f9e74d96532ac1f6bc62d9aebbd8aaab5d..6c68edae0becccf09ef34ad4a4bcba4f69a66901 100644 --- a/tools/ptests/wtests.ml +++ b/tools/ptests/wtests.ml @@ -211,7 +211,8 @@ let wrapper json test = let error = ret_code <> test.ret_code in if error || !verbosity > 0 then begin if test.out <> "" then print_file test.dir (if test.tmpout = "" then test.out else test.tmpout) ; - if test.err <> "" then print_file test.dir (if test.tmperr = "" then test.err else test.tmperr) + if test.err <> "" then print_file test.dir (if test.tmperr = "" then test.err else test.tmperr) ; + List.iter (print_file test.dir) test.log end; if error then begin Format.printf "%a: return code (%d) differs from the requested code (%d) for the command:%s@."