diff --git a/.gitignore b/.gitignore index 9ccbfe196a503330003c9018c2dc07cea07a801d..1ffefcd99851c35fd53e896331b4ad18238c0f5e 100644 --- a/.gitignore +++ b/.gitignore @@ -49,10 +49,6 @@ autom4te.cache /tests/crowbar/mutable /tests/crowbar/output-* /tests/crowbar/test_ghost_cfg -/tests/fc_script/compile_commands.json -/tests/journal/intra.byte -/tests/misc/my_visitor_plugin/my_visitor.opt -/tests/misc/my_visitor.sav /tests/spec/preprocess_dos.c /tests/*/*.opt @@ -191,7 +187,6 @@ Makefile.plugin.generated # generated ML files /src/libraries/utils/json.ml -/src/kernel_internals/runtime/toplevel_boot.ml /src/kernel_internals/runtime/fc_config.ml /src/kernel_internals/parsing/logic_lexer.ml /src/kernel_internals/parsing/logic_parser.ml @@ -206,8 +201,6 @@ Makefile.plugin.generated /src/plugins/gui/dgraph_helper.ml /src/plugins/gui/GSourceView.ml /src/plugins/gui/GSourceView.mli -/src/plugins/gui/GSourceView2.ml -/src/plugins/gui/GSourceView2.mli /src/plugins/gui/gtk_compat.ml /src/plugins/markdown-report/META diff --git a/Changelog b/Changelog index 37f1e9dfa35239b1be89b3abc1725d5d23a0df6f..21f182c3cdb9702f4c9092aa98869605474a7d48 100644 --- a/Changelog +++ b/Changelog @@ -17,6 +17,7 @@ Open Source Release <next-release> ################################## +o! Kernel [2022-02-19] Removed obsolete AST nodes IndexPI and Info o! Kernel [2021-12-03] Remove unused AST node Dcustom_annot and field fpadding_in_bits. Do not cache size of types in the AST but in a dedicated table. @@ -29,6 +30,10 @@ o! Kernel [2021-11-29] Integer.pretty does not have the optional argument Open Source Release 24.0 (Chromium) ################################### +-* Eva [2022-01-19] Always emits alarms about initialization, escaping + pointers and special floating-point values for the arguments of + calls to functions without body (or whose body is not analyzed), + even when -eva-warn-copy-indeterminate is unset. - ACSL [2021-10-28] better type checks for volatile clauses - Variadic [2021-10-26] translates printf/scanf calls even if formatting string is not constant, warning that it will assume arguments diff --git a/devel_tools/frama-c-callgrind b/devel_tools/frama-c-callgrind new file mode 100755 index 0000000000000000000000000000000000000000..3e23c01dbd87bf413615791fa3681d2bb16cab40 --- /dev/null +++ b/devel_tools/frama-c-callgrind @@ -0,0 +1,31 @@ +#!/bin/bash + +# Script for profiling Frama-C with callgrind (a valgrind tool). +# Note: execution time with valgrind is about 15x-20x slower. +# +# Use this script at the root of the repository, so local_export.sh can be found +# in bin. +# For more focused results, you can activate the profiling only after entering +# a specific function. For instance, to only profile Eva, add +# +# --toggle-collect='*Eva__Analysis__force_compute*' +# +# to the command line below. +# +# Example of invocation : +# +# devel_tools/frama-c-callgrind tests/idct/*.c -eva -float-normal -no-warn-signed-overflow +# +# This creates a 'callgrind.out' file (Callgrind format), which can be viewed +# with a tool such as kcachegrind: +# +# kcachegrind callgrind.out + +BASH_ARGV0="bin/frama-c" # hackish way to tell local_export that its dir is bin + +. bin/local_export.sh + +valgrind \ + --tool=callgrind --callgrind-out-file=callgrind.out --dump-instr=yes \ + --separate-callers=2 --collect-jumps=yes --fn-skip='caml_*' \ + $BINDIR/toplevel.opt "$@" diff --git a/doc/developer/developer.tex b/doc/developer/developer.tex index 26c80c5c03c60cfee2b45abf3c31300abf7acb5e..e8121da8686771c6abf0f7f0e51e35e633aacc77 100644 --- a/doc/developer/developer.tex +++ b/doc/developer/developer.tex @@ -16,6 +16,7 @@ \usepackage{makeidx} \usepackage{graphicx} \usepackage{enumerate} +\usepackage{longtable} \usepackage{varwidth} \usepackage{tikz} \usetikzlibrary{fit} diff --git a/doc/developer/refman.tex b/doc/developer/refman.tex index 3c0f1ec51989d413c9cfab797fc2dc0a1e29f0dc..d87c8f432ce7fce2355941b46daa3e0b9c5c7f87 100644 --- a/doc/developer/refman.tex +++ b/doc/developer/refman.tex @@ -841,8 +841,7 @@ to your needs. See \texttt{ocamlmerlin -help} for the list of flags. \subsection{Pre-defined macros for tests commands}\label{sec:ptests-macros} Ptests pre-defines a certain number of macros for each test about to be run. Figure~\ref{fig:ptests-macros} gives their definition. -\begin{figure}[htbp] -\begin{tabular}{|p{4.5cm}|p{10cm}|} +\begin{longtable}{|p{4.5cm}|p{10cm}|} \hline Name & Expansion \\ \hline @@ -897,9 +896,8 @@ one for regular tests (if more than one \verb|OPT|).\\ \hline \verb|frama-c-exe| & set to the value of the \verb|TOPLEVEL_PATH| variable from \verb|./tests/ptests_config| file\\ \hline -\end{tabular} \caption{Predefined macros for ptests}\label{fig:ptests-macros} -\end{figure} +\end{longtable} \section{Profiling with Landmarks} \label{refman:landmarks}\codeidxdef{Landmarks} @@ -937,6 +935,17 @@ For quick usage of the library: Commonly used options include \verb+output=landmarks.log+ to output the result to a file instead of \texttt{stderr}. + +To instrument a single file: add \verb+[@@@landmark "auto"]+ at the beginning +of the file. + +To instrument a single function: add \verb+[@landmark]+ after the \texttt{let}, +e.g.: + +\begin{lstlisting} + let[@landmark] add_visitor vis = +\end{lstlisting} + Check \url{https://github.com/LexiFi/landmarks} for its documentation. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/doc/userman/user-sources.tex b/doc/userman/user-sources.tex index a93678e60ecc0b19fcff3103e41f0dbc7b82a2b6..f104502d3423b2d9554110da8fae661c2b4109e9 100644 --- a/doc/userman/user-sources.tex +++ b/doc/userman/user-sources.tex @@ -281,7 +281,7 @@ a negative value, and choose the smallest rank possible starting from that is, its opposite option \optiondef{-}{remove-unused-types} is set. \item \texttt{\optiondef{-}{machdep} <machine architecture name>} defines the - target platform. The default value is a \texttt{x86\_32} bits + target platform. The default value is a \texttt{x86\_64} bits platform. Analyzers may take into account the \emph{endianness} of the target, the size and alignment of elementary data types, and other architecture/compilation parameters. The \texttt{-machdep} option provides a diff --git a/doc/value/examples/misa.c b/doc/value/examples/misa.c index 7c310b3662fa3e05c5157dc740df66513340c24f..7ca812b5d323a9b52130b1037c6f091bd7453f1b 100644 --- a/doc/value/examples/misa.c +++ b/doc/value/examples/misa.c @@ -3,5 +3,5 @@ int *t[2] = { &x, &y }; int main(void) { - return 1 + (int) * (int*) ((int) t + 2); + return * (int*) ((unsigned long) t + 6); } diff --git a/doc/value/main.tex b/doc/value/main.tex index 06e5735b0a4afc8a5df2a6fb238afc39aa8118cd..fe1e7decd6bbf224fbf55c7196514007a78798d5 100644 --- a/doc/value/main.tex +++ b/doc/value/main.tex @@ -371,7 +371,7 @@ frama-c -eva main_1.c >log \end{listing-nonumber} Frama-C has its own model of the target platform (the default target is -a little-endian 32-bit platform). It also uses the host system's preprocessor. +a little-endian 64-bit platform). It also uses the host system's preprocessor. If you want to do the analysis for a different platform than the host platform, you need to provide Frama-C with a way to pre-process the files as they would be during an actual compilation. @@ -579,7 +579,7 @@ use variable \lstinline|ONE| to detect endianness. Frama-C assumes a little-endian architecture by default, so \Eva{} is only analyzing the little-endian version of the library (Frama-C -also assumes an IA-32 architecture, so we are only +also assumes an IA-64 architecture, so we are only analyzing the library as compiled and run on this architecture). The big-endian version of the library could be analyzed by reproducing the same steps we are taking here for @@ -1349,14 +1349,14 @@ An example of a program leading to a misaligned read is the following: \listinginput{1}{examples/misa.c} The value returned by the function \lstinline|main| is\\ \lstinline|{{ garbled mix of &{ x; y } (origin: Misaligned { misa.c:6 }) }}|.\\ -The analyzer is by default configured for a 32-bit architecture, +The analyzer is by default configured for a 64-bit architecture, and that consequently the read memory access is not an out-of-bound access. If it was, an alarm would be emitted, and the analysis would go in a different direction. With the default target platform, the read access remains within the bounds of array \lstinline|t|, -but due to the offset of two bytes, +but due to the offset of six bytes, the 32-bit word read is made of the last two bytes from \lstinline|t[0]| and the first two bytes from \lstinline|t[1]|. diff --git a/headers/header_spec.txt b/headers/header_spec.txt index bfb81802ef8ea8ae06508e9c51c5504ccc8ee483..25b81ff83abfcef7c40a2e6de049149cb7fdbc53 100644 --- a/headers/header_spec.txt +++ b/headers/header_spec.txt @@ -190,6 +190,7 @@ share/libc/__fc_define_ino_t.h: CEA_LGPL share/libc/__fc_define_intptr_t.h: CEA_LGPL share/libc/__fc_define_iovec.h: CEA_LGPL share/libc/__fc_define_key_t.h: CEA_LGPL +share/libc/__fc_define_locale_t.h: CEA_LGPL share/libc/__fc_define_max_open_files.h: CEA_LGPL share/libc/__fc_define_mode_t.h: CEA_LGPL share/libc/__fc_define_nlink_t.h: CEA_LGPL @@ -254,6 +255,7 @@ share/libc/ifaddrs.h: CEA_LGPL share/libc/inttypes.c: CEA_LGPL share/libc/inttypes.h: CEA_LGPL share/libc/iso646.h: CEA_LGPL +share/libc/langinfo.h: CEA_LGPL share/libc/libgen.h: CEA_LGPL share/libc/limits.h: CEA_LGPL share/libc/locale.c: CEA_LGPL @@ -292,6 +294,7 @@ share/libc/stdio.c: CEA_LGPL share/libc/stdio.h: CEA_LGPL share/libc/stdlib.c: CEA_LGPL share/libc/stdlib.h: CEA_LGPL +share/libc/stdnoreturn.h: CEA_LGPL share/libc/string.c: CEA_LGPL share/libc/string.h: CEA_LGPL share/libc/strings.h: CEA_LGPL @@ -1118,10 +1121,6 @@ src/plugins/qed/collection.mli: CEA_WP src/plugins/qed/engine.mli: CEA_WP src/plugins/qed/export.ml: CEA_WP src/plugins/qed/export.mli: CEA_WP -src/plugins/qed/export_altergo.ml: CEA_WP -src/plugins/qed/export_altergo.mli: CEA_WP -src/plugins/qed/export_coq.ml: CEA_WP -src/plugins/qed/export_coq.mli: CEA_WP src/plugins/qed/export_why3.ml: CEA_WP src/plugins/qed/export_why3.mli: CEA_WP src/plugins/qed/export_whycore.ml: CEA_WP @@ -1227,6 +1226,8 @@ src/plugins/server/server_parameters.ml: CEA_LGPL_OR_PROPRIETARY src/plugins/server/server_parameters.mli: CEA_LGPL_OR_PROPRIETARY src/plugins/server/server_batch.ml: CEA_LGPL_OR_PROPRIETARY src/plugins/server/server_batch.mli: CEA_LGPL_OR_PROPRIETARY +src/plugins/server/server_socket.ml: CEA_LGPL_OR_PROPRIETARY +src/plugins/server/server_socket.mli: CEA_LGPL_OR_PROPRIETARY src/plugins/server/server_zmq.ml: CEA_LGPL_OR_PROPRIETARY src/plugins/server/server_zmq.mli: CEA_LGPL_OR_PROPRIETARY src/plugins/server/states.ml: CEA_LGPL_OR_PROPRIETARY @@ -1311,6 +1312,7 @@ src/plugins/studia/writes.mli: CEA_LGPL_OR_PROPRIETARY src/plugins/users/Users.mli: CEA_LGPL_OR_PROPRIETARY src/plugins/users/users_register.ml: CEA_LGPL_OR_PROPRIETARY src/plugins/users/users_register.mli: CEA_LGPL_OR_PROPRIETARY +src/plugins/value/.merlin: .ignore src/plugins/value/Changelog_non_free: .ignore src/plugins/value/Eva.mli: CEA_LGPL_OR_PROPRIETARY src/plugins/value/alarmset.ml: CEA_LGPL_OR_PROPRIETARY @@ -1481,6 +1483,8 @@ src/plugins/value/utils/eva_annotations.ml: CEA_LGPL_OR_PROPRIETARY src/plugins/value/utils/eva_annotations.mli: CEA_LGPL_OR_PROPRIETARY src/plugins/value/utils/eva_audit.ml: CEA_LGPL_OR_PROPRIETARY src/plugins/value/utils/eva_audit.mli: CEA_LGPL_OR_PROPRIETARY +src/plugins/value/utils/eva_dynamic.ml: CEA_LGPL_OR_PROPRIETARY +src/plugins/value/utils/eva_dynamic.mli: CEA_LGPL_OR_PROPRIETARY src/plugins/value/utils/structure.ml: CEA_LGPL_OR_PROPRIETARY src/plugins/value/utils/structure.mli: CEA_LGPL_OR_PROPRIETARY src/plugins/value/utils/summary.ml: CEA_LGPL_OR_PROPRIETARY @@ -1688,10 +1692,6 @@ src/plugins/wp/ProofSession.ml: CEA_WP src/plugins/wp/ProofSession.mli: CEA_WP src/plugins/wp/ProofScript.ml: CEA_WP src/plugins/wp/ProofScript.mli: CEA_WP -src/plugins/wp/ProverCoq.ml: CEA_WP -src/plugins/wp/ProverCoq.mli: CEA_WP -src/plugins/wp/ProverErgo.ml: CEA_WP -src/plugins/wp/ProverErgo.mli: CEA_WP src/plugins/wp/ProverScript.ml: CEA_WP src/plugins/wp/ProverScript.mli: CEA_WP src/plugins/wp/ProverSearch.ml: CEA_WP @@ -1754,6 +1754,8 @@ src/plugins/wp/TacInstance.ml: CEA_WP src/plugins/wp/TacInstance.mli: CEA_WP src/plugins/wp/TacLemma.ml: CEA_WP src/plugins/wp/TacLemma.mli: CEA_WP +src/plugins/wp/TacModMask.ml: CEA_WP +src/plugins/wp/TacModMask.mli: CEA_WP src/plugins/wp/TacNormalForm.ml: CEA_WP src/plugins/wp/TacNormalForm.mli: CEA_WP src/plugins/wp/TacOverflow.ml: CEA_WP @@ -1847,8 +1849,6 @@ src/plugins/wp/intro_wp.txt: CEA_WP src/plugins/wp/mcfg.mli: CEA_WP src/plugins/wp/normAtLabels.ml: CEA_WP src/plugins/wp/normAtLabels.mli: CEA_WP -src/plugins/wp/proof.ml: CEA_WP -src/plugins/wp/proof.mli: CEA_WP src/plugins/wp/prover.ml: CEA_WP src/plugins/wp/prover.mli: CEA_WP src/plugins/wp/register.ml: CEA_WP @@ -1858,7 +1858,6 @@ src/plugins/wp/rformat.mll: CEA_WP src/plugins/wp/script.mli: CEA_WP src/plugins/wp/script.mll: CEA_WP src/plugins/wp/share/.gitignore: .ignore -src/plugins/wp/share/Makefile.coqwp: CEA_WP src/plugins/wp/share/Makefile.resources: CEA_WP src/plugins/wp/share/coqwp/ArcTrigo.v: CEA_WP src/plugins/wp/share/coqwp/Bits.v: CEA_WP @@ -1896,37 +1895,6 @@ src/plugins/wp/share/coqwp/real/Real.v: UNMODIFIED_WHY3 src/plugins/wp/share/coqwp/real/RealInfix.v: UNMODIFIED_WHY3 src/plugins/wp/share/coqwp/real/Square.v: UNMODIFIED_WHY3 src/plugins/wp/share/coqwp/real/Trigonometry.v: UNMODIFIED_WHY3 -src/plugins/wp/share/ergo/ArcTrigo.mlw: CEA_WP -src/plugins/wp/share/ergo/Cbits.mlw: CEA_WP -src/plugins/wp/share/ergo/Cfloat.mlw: CEA_WP -src/plugins/wp/share/ergo/Cint.mlw: CEA_WP -src/plugins/wp/share/ergo/Cmath.mlw: CEA_WP -src/plugins/wp/share/ergo/ExpLog.mlw: CEA_WP -src/plugins/wp/share/ergo/Memory.mlw: CEA_WP -src/plugins/wp/share/ergo/Qed.mlw: CEA_WP -src/plugins/wp/share/ergo/Square.mlw: CEA_WP -src/plugins/wp/share/ergo/Vlist.mlw: CEA_WP -src/plugins/wp/share/ergo/Vset.mlw: CEA_WP -src/plugins/wp/share/ergo/bool.Bool.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/int.Abs.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/int.ComputerDivision.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/int.ComputerOfEuclideanDivision.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/int.Int.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/int.MinMax.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/map.Map.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/map.Const.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/real.Abs.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/real.ExpLog.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/real.Hyperbolic.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/real.FromInt.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/real.MinMax.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/real.Polar.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/real.PowerReal.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/real.Real.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/real.RealInfix.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/real.Square.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/real.Trigonometry.mlw: MODIFIED_WHY3 -src/plugins/wp/share/ergo/real.Truncate.mlw: MODIFIED_WHY3 src/plugins/wp/share/install.ml: CEA_WP src/plugins/wp/share/why3/frama_c_wp/cbits.mlw: CEA_WP src/plugins/wp/share/why3/frama_c_wp/cfloat.mlw: CEA_WP diff --git a/ivette/.dome-pkg-app.lock b/ivette/.dome-pkg-app.lock index f9677904486a71fb448d4a6db632128c0d3013ac..f0697a7751cd221ec9109af1343836575198fa13 100644 --- a/ivette/.dome-pkg-app.lock +++ b/ivette/.dome-pkg-app.lock @@ -1 +1 @@ -react@^16.8 react-dom source-map-support lodash react-virtualized react-draggable react-fast-compare codemirror +react@^16 react-dom@^16 source-map-support lodash react-virtualized react-draggable react-fast-compare codemirror diff --git a/ivette/.dome-pkg-dev.lock b/ivette/.dome-pkg-dev.lock index e1751fd66367a580e267a065cb09c992b4c59e94..c595807b2fffede8b6237c397c38c9b0a164c03e 100644 --- a/ivette/.dome-pkg-dev.lock +++ b/ivette/.dome-pkg-dev.lock @@ -1 +1 @@ -@babel/core@^7 @babel/preset-env @babel/preset-react @babel/plugin-proposal-object-rest-spread electron@^7 electron-builder electron-webpack electron-devtools-installer webpack babel-loader css-loader react-hot-loader @hot-loader/react-dom @types/react +@babel/core @babel/preset-env @babel/preset-react @babel/plugin-proposal-object-rest-spread electron@^16 electron-builder electron-webpack electron-devtools-installer webpack@^4 babel-loader css-loader@^5 react-hot-loader@^4 @hot-loader/react-dom@^16 @types/react@^16 @types/react-dom@^16 @types/react-virtualized@^9.21.0 diff --git a/ivette/.eslintignore b/ivette/.eslintignore index ba02ae7397f98663969ed6a85953c7f336d21644..80c4dad31d64840d5d6d79f38348aa75575ec9cf 100644 --- a/ivette/.eslintignore +++ b/ivette/.eslintignore @@ -8,3 +8,4 @@ coverage lib # don't lint the generated API api + diff --git a/ivette/.eslintrc.js b/ivette/.eslintrc.js index 322375d876f3c51d95ac3358b423fc19b4f04e30..377b7766eed573f8ab0340b9b33bd8a152e57c35 100644 --- a/ivette/.eslintrc.js +++ b/ivette/.eslintrc.js @@ -3,6 +3,7 @@ module.exports = { parser: '@typescript-eslint/parser', plugins: [ '@typescript-eslint', + 'import', ], extends: [ 'airbnb-typescript', @@ -32,15 +33,13 @@ module.exports = { "@typescript-eslint/no-explicit-any": "off", // Allow functions without return type, even if exported function should have one "@typescript-eslint/explicit-function-return-type": "off", - // Allow function hoisting, even if it should be avoided - "no-use-before-define": [ - "error", - { functions: false, classes: true, variables: true }, - ], - "@typescript-eslint/no-use-before-define": [ - "error", - { functions: false, classes: true, variables: true, typedefs: true }, - ], + // Allow function hoisting, even if it should be avoided" + "@typescript-eslint/lines-between-class-members": "off", + "@typescript-eslint/space-before-function-paren": "off", + "@typescript-eslint/naming-convention": "off", + "no-constant-condition": ["error", { "checkLoops": false }], + "no-use-before-define": "off", + "@typescript-eslint/no-use-before-define": "off", // Prefer const when _all_ destructured values may be const "prefer-const": [ "error", @@ -51,7 +50,7 @@ module.exports = { // Allow return statements even if not strictly needed "no-useless-return": "off", // Forbid shadowing concerning variables - "no-shadow": "error", + "no-shadow": "off", // Force single class member per line "lines-between-class-members": [ "error", "always", { "exceptAfterSingleLine": true } @@ -68,6 +67,8 @@ module.exports = { "curly": "off", // Do not specify position for single commands "nonblock-statement-body-position": "off", + // Requires '+' to be applied on 2 numbers or 2 strings only + "@typescript-eslint/restrict-plus-operands": "error", // Allow ++/-- operators only in for-loops "no-plusplus": ["error", { "allowForLoopAfterthoughts": true }], // Force code to 80 columns, but for trailing comments @@ -80,6 +81,8 @@ module.exports = { "react/jsx-one-expression-per-line": "off", // Allow property spreading since with aim at using TSC "react/jsx-props-no-spreading": "off", + // Allow using functions in JSX props + "react/jsx-no-bind": "off", // Allow all sorts of linebreaking for operators "operator-linebreak": "off", // Force curly brackets on newline if some item is diff --git a/ivette/.gitignore b/ivette/.gitignore index 240ca44f95f46161b7c33d9615383da046dda4e1..aa5b96a0e2174092c0ef7d3ad13a8c3aca51311c 100644 --- a/ivette/.gitignore +++ b/ivette/.gitignore @@ -13,5 +13,6 @@ yarn-error.log /dist /doc/html /src/renderer/loader.ts +/src/dome/doc/guides/icons.md # -------------------------------------------------------------------------- diff --git a/ivette/Makefile b/ivette/Makefile index 5eb6b875e790528e4fff0687bea2eded6f9f6ef4..c2b5abe73d4cd5d71758a12dac33a7f3a68d1310 100644 --- a/ivette/Makefile +++ b/ivette/Makefile @@ -107,40 +107,35 @@ api: # --- Ivette Documentation # -------------------------------------------------------------------------- +.PHONY: icons + VERSION=$(shell echo "console.log(require('./package.json').version)" | node -) DOC_ICONS_CSS= src/dome/doc/gallery.css DOC_ICONS_MAKE= src/dome/doc/iconsmd.js +DOC_ICONS_GALLERY= src/dome/doc/guides/icons.md DOC_ICONS_DATA= src/dome/renderer/controls/gallery.json DOC_GUIDES= src/dome/doc/guides NODEBIN= ./node_modules/.bin -doc: $(NODEBIN)/typedoc +DOCDIRS= src/ivette src/dome/renderer src/dome/utils src/frama-c/api +DOCFILES= src/frama-c/server.ts src/frama-c/states.ts $(shell find $(DOCDIRS) -name "*.ts" -or -name "*.tsx") + +icons: $(DOC_ICONS_GALLERY) + +$(DOC_ICONS_GALLERY): $(DOC_ICONS_MAKE) $(DOC_ICONS_DATA) + @rm -f $@ + @node $(DOC_ICONS_MAKE) $(DOC_ICONS_DATA) > src/dome/doc/guides/icons.md + @chmod a-w $@ + +doc: $(NODEBIN)/typedoc icons @echo "\n[Ivette] documentation" @rm -fr doc/html - @yarn run typedoc - @mkdir -p doc/html/guides - @echo "\n[Ivette] guides" - @node $(DOC_ICONS_MAKE) $(DOC_ICONS_DATA) > doc/html/guides/icons.md - @cp $(DOC_ICONS_CSS) doc/html/assets/css/ - @find $(DOC_GUIDES) -name "*.md" -exec cp -f {} doc/html/guides/ \; - @find doc/html/guides -name "*.md" -print -exec pandoc \ - --standalone --toc --toc-depth=2 --to html \ - --template doc/pandoc/template.html \ - --metadata title="Ivette Documentation" \ - --metadata version="v$(VERSION)" \ - --metadata-file=doc/pandoc/index.json \ - --lua-filter doc/pandoc/href.lua \ - {} -o {}.html \; -delete + @yarn run typedoc $(DOCFILES) @echo "\n[Ivette] main page" @echo " file://$(PWD)/doc/html/index.html" -# For searching the doc -serve: $(NODEBIN)/serve - @echo "[Ivette] serve doc documentation" - @yarn run serve doc/html - $(NODEBIN)/%: @echo "[Node] install package $*" yarn add -D $* diff --git a/ivette/Makefile.distrib b/ivette/Makefile.distrib index e79806e2c2f52e188d9630582036b96a8afb96d8..c7151c1ea54da7f5a9dc03ed2347b09a0bd829bf 100644 --- a/ivette/Makefile.distrib +++ b/ivette/Makefile.distrib @@ -88,6 +88,7 @@ DISTRIB_FILES += ivette/src/dome/misc/register.js DISTRIB_FILES += ivette/src/dome/misc/system.ts DISTRIB_FILES += ivette/src/dome/misc/utils.ts DISTRIB_FILES += ivette/src/dome/renderer/controls/buttons.tsx +DISTRIB_FILES += ivette/src/dome/renderer/controls/displays.tsx DISTRIB_FILES += ivette/src/dome/renderer/controls/gallery.json DISTRIB_FILES += ivette/src/dome/renderer/controls/icons.tsx DISTRIB_FILES += ivette/src/dome/renderer/controls/labels.tsx @@ -148,6 +149,9 @@ DISTRIB_FILES += ivette/src/frama-c/api/generated/plugins/eva/general/index.ts DISTRIB_FILES += ivette/src/frama-c/api/generated/plugins/eva/values/index.ts DISTRIB_FILES += ivette/src/frama-c/api/generated/plugins/studia/studia/index.ts DISTRIB_FILES += ivette/src/frama-c/api/generator.ml +DISTRIB_FILES += ivette/src/frama-c/client.ts +DISTRIB_FILES += ivette/src/frama-c/client_socket.ts +DISTRIB_FILES += ivette/src/frama-c/client_zmq.ts DISTRIB_FILES += ivette/src/frama-c/index.tsx DISTRIB_FILES += ivette/src/frama-c/kernel/ASTinfo.tsx DISTRIB_FILES += ivette/src/frama-c/kernel/ASTview.tsx diff --git a/ivette/README.md b/ivette/README.md index 27e6a2adb061d69ad9a5b6aae9d801d9cf4543ed..974baad793a643bcfa8daef69f9ada3b9f0a0c43 100644 --- a/ivette/README.md +++ b/ivette/README.md @@ -1,29 +1,10 @@ -## Ivette - -Main entry points: -- [frama-c/server](modules/frama_c_server.html) Frama-C Server interaction (low level) -- [frama-c/states](modules/frama_c_states.html) high-level request management - -## Command Line - -The following options are recognized by `./bin/frama-c-gui`: - -- `--cwd` working directory of Frama-C server -- `--command` path to Frama-C binary -- `--socket` ZeroMQ socket address of the server - -The default working directory is the current one. -The default command is the local `bin/frama-c` of source installation. -The default socket is `ipc:///.frama-c.<pid>.io`. - -## Dome Guides - -- [Dome Framework](guides/dome.md.html) -- [Quick Start](guides/quickstart.md.html) -- [Live Editing](guides/hotreload.md.html) -- [Application Design](guides/application.md.html) -- [Application Development](guides/development.md.html) -- [Styling Components](guides/styling.md.html) -- [Custom Hooks](guides/hooks.md.html) -- [Icon Gallery](guides/icons.md.html) -- [Glossary](guides/glossary.md.html) +## Dome + +- [Dome Framework](src/dome/doc/guides/dome.md) +- [Quick Start](src/dome/doc/guides/quickstart.md) +- [Live Editing](src/dome/doc/guides/hotreload.md) +- [Application Design](src/dome/doc/guides/guides/application.md) +- [Application Development](src/dome/doc/guides/development.md) +- [Styling Components](src/dome/doc/guides/styling.md) +- [Custom Hooks](src/dome/doc/guides/hooks.md) +- [Glossary](src/dome/doc/guides/glossary.md) diff --git a/ivette/headers/header_spec.txt b/ivette/headers/header_spec.txt index b9071476398428233fd4e67749117525993bc0b6..40e6b6a4e9f5513ecc7435d3715a8441ef52f6e4 100644 --- a/ivette/headers/header_spec.txt +++ b/ivette/headers/header_spec.txt @@ -88,6 +88,7 @@ src/dome/misc/register.js: CEA_LGPL src/dome/misc/system.ts: CEA_LGPL src/dome/misc/utils.ts: CEA_LGPL src/dome/renderer/controls/buttons.tsx: CEA_LGPL +src/dome/renderer/controls/displays.tsx: CEA_LGPL src/dome/renderer/controls/gallery.json: .ignore src/dome/renderer/controls/icons.tsx: CEA_LGPL src/dome/renderer/controls/labels.tsx: CEA_LGPL @@ -148,6 +149,9 @@ src/frama-c/api/generated/plugins/eva/general/index.ts: CEA_LGPL src/frama-c/api/generated/plugins/eva/values/index.ts: CEA_LGPL src/frama-c/api/generated/plugins/studia/studia/index.ts: CEA_LGPL src/frama-c/api/generator.ml: .ignore +src/frama-c/client.ts: CEA_LGPL +src/frama-c/client_socket.ts: CEA_LGPL +src/frama-c/client_zmq.ts: CEA_LGPL src/frama-c/index.tsx: CEA_LGPL src/frama-c/kernel/ASTinfo.tsx: CEA_LGPL src/frama-c/kernel/ASTview.tsx: CEA_LGPL diff --git a/ivette/headers/register.sh b/ivette/headers/register.sh index 364d496488c319570a907c0f377a5222e1b7c30e..d288cc053ac8fefda9d37e85a7c3e62adc03d19a 100755 --- a/ivette/headers/register.sh +++ b/ivette/headers/register.sh @@ -1,6 +1,6 @@ #!/bin/sh case "$1" in - Makefile.distrib | *.json | src/dome/doc/* | *.eslintrc.js ) + Makefile.distrib | *.json | src/dome/doc/* | */.eslintrc.js ) echo "$1: .ignore" ;; *Make* | src/*/*.js* | src/*/*.ts* ) diff --git a/ivette/package.json b/ivette/package.json index 4accc25c115927804617213092dd1a8ebf2aead9..52655b7d59c4bec9f1c4207977f1c0733d76dad1 100644 --- a/ivette/package.json +++ b/ivette/package.json @@ -12,72 +12,73 @@ "build": "tsc" }, "devDependencies": { - "@babel/cli": "^7.8.4", - "@babel/core": "^7", - "@babel/plugin-proposal-class-properties": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.9.0", - "@babel/plugin-transform-runtime": "^7.9.0", - "@babel/preset-env": "^7.9.0", - "@babel/preset-react": "^7.9.4", - "@babel/preset-typescript": "^7.9.0", - "@hot-loader/react-dom": "^16.13.0", - "@types/codemirror": "^0.0.97", - "@types/cytoscape": "^3.14.5", - "@types/lodash": "^4.14.149", - "@types/node": "12.12.21", - "@types/react": "^16.9.17", - "@types/react-dom": "^16.9.6", - "@types/react-virtualized": "^9.21.10", - "@typescript-eslint/eslint-plugin": "^2.28.0", - "@typescript-eslint/parser": "^2.28.0", - "babel-loader": "^8.0.6", - "css-loader": "^3.4.0", - "electron": "^7", - "electron-builder": "^22.4.1", - "electron-devtools-installer": "^3.0.0", + "@babel/cli": "", + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "", + "@babel/plugin-proposal-object-rest-spread": "^7.16.0", + "@babel/plugin-transform-runtime": "", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "", + "@hot-loader/react-dom": "^16", + "@types/codemirror": "", + "@types/cytoscape": "", + "@types/estree": "^0.0.50", + "@types/lodash": "", + "@types/node": "", + "@types/react": "^16", + "@types/react-dom": "^16", + "@types/react-virtualized": "^9.21.0", + "@types/zeromq": "^5.2.1", + "@typescript-eslint/eslint-plugin": "", + "@typescript-eslint/parser": "", + "babel-loader": "^8.2.3", + "css-loader": "^5", + "electron": "^16", + "electron-devtools-installer": "^3.2.0", "electron-webpack": "^2.8.2", - "eslint": "^6.8.0", - "eslint-config-airbnb": "^18.1.0", - "eslint-config-airbnb-typescript": "^7.2.1", - "eslint-plugin-import": "^2.20.2", - "eslint-plugin-jsx-a11y": "^6.3.0", - "eslint-plugin-react": "^7.19.0", - "eslint-plugin-react-hooks": "^3.0.0", - "html-loader": "1.0.0-alpha.0", - "jsdoc": "^3.6.3", - "react-hot-loader": "^4.12.20", - "serve": "^11.3.0", - "typedoc": "^0.17.8", - "typedoc-plugin-external-module-name": "^3.1.0", - "typescript": "^3.8.3", - "webpack": "^4.41.4" + "eslint": "", + "eslint-config-airbnb": "", + "eslint-config-airbnb-typescript": "", + "eslint-plugin-import": "", + "eslint-plugin-jsx-a11y": "", + "eslint-plugin-react": "", + "eslint-plugin-react-hooks": "", + "html-loader": "^1", + "jsdoc": "", + "react-hot-loader": "^4", + "serve": "", + "typedoc": "", + "typescript": "", + "webpack": "^4" }, "dependencies": { - "@babel/runtime": "^7.9.2", - "@fortawesome/fontawesome-free": "^5.13.1", - "@types/diff": "^4.0.2", - "@types/react-window": "^1.8.2", - "codemirror": "^5.52.2", - "cytoscape": "^3.15.1", - "cytoscape-cola": "^2.3.1", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-cxtmenu": "^3.1.2", - "cytoscape-dagre": "^2.2.2", - "cytoscape-klay": "^3.1.3", - "cytoscape-panzoom": "^2.5.3", - "cytoscape-popper": "^1.0.7", - "diff": "^5.0.0", - "immutable": "^4.0.0-rc.12", - "lodash": "^4.17.15", - "react": "^16.8", - "react-cytoscapejs": "^1.2.1", - "react-dom": "^16.13.1", - "react-draggable": "^4.2.0", + "@babel/runtime": "", + "@fortawesome/fontawesome-free": "", + "@types/diff": "", + "@types/react-window": "", + "codemirror": "^5.64.0", + "cytoscape": "", + "cytoscape-cola": "", + "cytoscape-cose-bilkent": "", + "cytoscape-cxtmenu": "", + "cytoscape-dagre": "", + "cytoscape-klay": "", + "cytoscape-panzoom": "", + "cytoscape-popper": "", + "diff": "", + "electron-builder": "^22.14.5", + "immutable": "", + "lodash": "^4.17.21", + "react": "^16", + "react-cytoscapejs": "", + "react-dom": "^16", + "react-draggable": "^4.4.4", "react-fast-compare": "^3.2.0", - "react-virtualized": "^9.21.2", - "react-window": "^1.8.6", - "source-map-support": "^0.5.16", - "tippy.js": "5.2.1", - "zeromq": "^6.0.0-beta.5" + "react-virtualized": "^9.22.3", + "react-window": "", + "source-map-support": "^0.5.21", + "tippy.js": "", + "zeromq": "^5.2.8" } } diff --git a/ivette/src/dome/doc/iconsmd.js b/ivette/src/dome/doc/iconsmd.js index 74cdbec61c0bffee30a58382025c46a1248343b2..f8e4dfe72724723e867b8f52b51313ced5ff70c7 100644 --- a/ivette/src/dome/doc/iconsmd.js +++ b/ivette/src/dome/doc/iconsmd.js @@ -21,16 +21,15 @@ for ( var name in icons ) { index.sort(); if (sections["Others"]) index.push("Others"); -console.log( '---' ); -console.log( 'subtitle: Icons Gallery' ); -console.log( '---' ); console.log(); // --- Gallery (per section) ----------------------------------------- for ( var s = 0 ; s < index.length ; s++ ) { const section = index[s] ; - console.log( `## ${section} {#SECTION.${section}}` ); + console.log( '<hr/>' ); + console.log(); + console.log( `## ${section}` ); console.log(); console.log( ` <div class="database">` ); diff --git a/ivette/src/dome/main/dome.ts b/ivette/src/dome/main/dome.ts index 605cfbd5d84d6ec0fdfe602692e0e1221c4acba6..8aa0d1dffa1b8e60cba69a597496ffa670c0d7fa 100644 --- a/ivette/src/dome/main/dome.ts +++ b/ivette/src/dome/main/dome.ts @@ -45,6 +45,7 @@ import { BrowserWindowConstructorOptions, IpcMainEvent, shell, + dialog, } from 'electron'; import installExtension, { REACT_DEVELOPER_TOOLS } from 'dome/devtools'; import SYS, * as System from 'dome/system'; @@ -174,9 +175,9 @@ ipcMain.on('dome.ipc.settings.sync', windowSyncSettings); // --- Patching Settings // -------------------------------------------------------------------------- -type patch = { key: string; value: any }; +type Patch = { key: string; value: any }; -function applyPatches(data: Store, args: patch[]) { +function applyPatches(data: Store, args: Patch[]) { args.forEach(({ key, value }) => { if (value === null) { delete data[key]; @@ -186,7 +187,7 @@ function applyPatches(data: Store, args: patch[]) { }); } -function applyWindowSettings(event: IpcMainEvent, args: patch[]) { +function applyWindowSettings(event: IpcMainEvent, args: Patch[]) { const handle = WindowHandles.get(event.sender.id); if (handle) { applyPatches(handle.settings, args); @@ -194,7 +195,7 @@ function applyWindowSettings(event: IpcMainEvent, args: patch[]) { } } -function applyStorageSettings(event: IpcMainEvent, args: patch[]) { +function applyStorageSettings(event: IpcMainEvent, args: Patch[]) { const handle = WindowHandles.get(event.sender.id); if (handle) { applyPatches(handle.storage, args); @@ -202,7 +203,7 @@ function applyStorageSettings(event: IpcMainEvent, args: patch[]) { } } -function applyGlobalSettings(event: IpcMainEvent, args: patch[]) { +function applyGlobalSettings(event: IpcMainEvent, args: Patch[]) { applyPatches(obtainGlobalSettings(), args); BrowserWindow.getAllWindows().forEach((w: BrowserWindow) => { const contents = w.webContents; @@ -274,7 +275,7 @@ function getURL() { return `file://${__dirname}/index.html`; } -function navigateURL(sender: Electron.webContents) { +function navigateURL(sender: Electron.WebContents) { return (event: Electron.Event, url: string) => { event.preventDefault(); const href = new URL(url); @@ -328,6 +329,7 @@ function createBrowserWindow( backgroundColor: '#f0f0f0', webPreferences: { nodeIntegration: true, + contextIsolation: false, additionalArguments: [browserArguments], }, ...config, @@ -521,6 +523,15 @@ function restoreDefaultSettings() { ipcMain.on('dome.menu.settings', showSettingsWindow); ipcMain.on('dome.menu.defaults', restoreDefaultSettings); +ipcMain.on('dome.app.paths', (event) => { + event.returnValue = { + 'home': app.getPath('home'), + 'desktop': app.getPath('desktop'), + 'documents': app.getPath('documents'), + 'downloads': app.getPath('downloads'), + 'temp': app.getPath('temp'), + }; +}); // -------------------------------------------------------------------------- // --- Main Application Starter @@ -586,3 +597,22 @@ ipcMain.on('dome.ipc.menu.addmenuitem', (_evt, spec) => addMenuItem(spec)); ipcMain.on('dome.ipc.menu.setmenuitem', (_evt, spec) => setMenuItem(spec)); // -------------------------------------------------------------------------- +// --- Dialogs Management +// -------------------------------------------------------------------------- + +ipcMain.handle( + 'dome.dialog.showMessageBox', + (_evt, props) => dialog.showMessageBox(props), +); + +ipcMain.handle( + 'dome.dialog.showOpenDialog', + (_evt, props) => dialog.showOpenDialog(props), +); + +ipcMain.handle( + 'dome.dialog.showSaveDialog', + (_evt, props) => dialog.showSaveDialog(props), +); + +// -------------------------------------------------------------------------- diff --git a/ivette/src/dome/main/menubar.ts b/ivette/src/dome/main/menubar.ts index d22df5c443ed5515b682d289ec1ff83d01413fcb..ee337d568b02d50ebed7261ac6c29b74f9d332cc 100644 --- a/ivette/src/dome/main/menubar.ts +++ b/ivette/src/dome/main/menubar.ts @@ -24,10 +24,15 @@ // --- Menus & MenuBar Management // -------------------------------------------------------------------------- -/* eslint-disable max-len */ -/* eslint-disable @typescript-eslint/camelcase */ - -import { app, ipcMain, BrowserWindow, Menu, MenuItem, shell } from 'electron'; +import { + app, + ipcMain, + BrowserWindow, + Menu, + MenuItem, + shell, + KeyboardEvent, +} from 'electron'; import * as System from 'dome/system'; // -------------------------------------------------------------------------- @@ -48,16 +53,33 @@ function reloadWindow() { }); } -function toggleFullScreen(_item: MenuItem, focusedWindow: BrowserWindow) { +function toggleFullScreen( + _item: MenuItem, + focusedWindow: BrowserWindow | undefined, + _evt: KeyboardEvent, +) { if (focusedWindow) focusedWindow.setFullScreen(!focusedWindow.isFullScreen()); } -function toggleDevTools(_item: MenuItem, focusedWindow: BrowserWindow) { +function toggleDevTools( + _item: MenuItem, + focusedWindow: BrowserWindow | undefined, + _evt: KeyboardEvent, +) { if (focusedWindow) focusedWindow.webContents.toggleDevTools(); } +function userFindInfo( + _item: MenuItem, + focusedWindow: BrowserWindow | undefined, + _evt: KeyboardEvent, +) { + if (focusedWindow) + focusedWindow.webContents.send('dome.ipc.find'); +} + // -------------------------------------------------------------------------- // --- Menu Utilities // -------------------------------------------------------------------------- @@ -131,9 +153,9 @@ const macosAppMenuItems = (appName: string): MenuSpec => [ // --- File Menu Items (platform dependant) // -------------------------------------------------------------------------- -const fileMenuItems_custom: MenuSpec = []; +const fileMenuItemsCustom: MenuSpec = []; -const fileMenuItems_linux: MenuSpec = [ +const fileMenuItemsLinux: MenuSpec = [ { label: 'Preferences…', click: () => ipcMain.emit('dome.menu.settings'), @@ -154,7 +176,7 @@ const fileMenuItems_linux: MenuSpec = [ // --- Edit Menu Items // -------------------------------------------------------------------------- -const editMenuItems_custom: MenuSpec = []; +const editMenuItemsCustom: MenuSpec = []; const editMenuItems: MenuSpec = [ { @@ -188,11 +210,7 @@ const editMenuItems: MenuSpec = [ { label: 'Find', accelerator: 'CmdOrCtrl+F', - click: ( - _item: Electron.MenuItem, - window: Electron.BrowserWindow, - _evt: Electron.KeyboardEvent, - ) => window.webContents.send('dome.ipc.find'), + click: userFindInfo, }, ]; @@ -200,7 +218,7 @@ const editMenuItems: MenuSpec = [ // --- View Menu Items // -------------------------------------------------------------------------- -const viewMenuItems_custom: MenuSpec = []; +const viewMenuItemsCustom: MenuSpec = []; const viewMenuItems = (osx: boolean): MenuSpec => [ { @@ -222,7 +240,7 @@ const viewMenuItems = (osx: boolean): MenuSpec => [ // --- Window Menu Items // -------------------------------------------------------------------------- -const windowMenuItems_linux: MenuSpec = [ +const windowMenuItemsLinux: MenuSpec = [ { label: 'Minimize', accelerator: 'CmdOrCtrl+M', @@ -241,7 +259,7 @@ const windowMenuItems_linux: MenuSpec = [ }, ]; -const windowMenuItems_macos: MenuSpec = windowMenuItems_linux.concat([ +const windowMenuItemsMacos: MenuSpec = windowMenuItemsLinux.concat([ { label: 'Bring All to Front', role: 'front', @@ -292,9 +310,9 @@ const customItems = new Map<string, ItemEntry>(); function findMenu(label: string): MenuSpec | undefined { switch (label) { - case 'File': return fileMenuItems_custom; - case 'Edit': return editMenuItems_custom; - case 'View': return viewMenuItems_custom; + case 'File': return fileMenuItemsCustom; + case 'Edit': return editMenuItemsCustom; + case 'View': return viewMenuItemsCustom; default: { const cm = customMenus.find((m) => m.label === label); return cm && cm.submenu; @@ -317,12 +335,12 @@ export interface CustomMenuItem extends MenuItemSpec { key?: string; } -export interface Separator { +export interface SeparatorItem { menu: string; type: 'separator'; } -export type CustomMenuItemSpec = Separator | CustomMenuItem; +export type CustomMenuItemSpec = SeparatorItem | CustomMenuItem; export function addMenuItem(custom: CustomMenuItemSpec) { const menuSpec = findMenu(custom.menu); @@ -337,16 +355,22 @@ export function addMenuItem(custom: CustomMenuItemSpec) { if (key) { switch (System.platform) { case 'macos': - if (key.startsWith('Cmd+')) spec.accelerator = `Cmd+${key.substring(4)}`; - if (key.startsWith('Alt+')) spec.accelerator = `Cmd+Alt+${key.substring(4)}`; - if (key.startsWith('Meta+')) spec.accelerator = `Cmd+Shift+${key.substring(5)}`; + if (key.startsWith('Cmd+')) + spec.accelerator = `Cmd+${key.substring(4)}`; + if (key.startsWith('Alt+')) + spec.accelerator = `Cmd+Alt+${key.substring(4)}`; + if (key.startsWith('Meta+')) + spec.accelerator = `Cmd+Shift+${key.substring(5)}`; break; case 'windows': case 'linux': default: - if (key.startsWith('Cmd+')) spec.accelerator = `Ctrl+${key.substring(4)}`; - if (key.startsWith('Alt+')) spec.accelerator = `Alt+${key.substring(4)}`; - if (key.startsWith('Meta+')) spec.accelerator = `Ctrl+Alt+${key.substring(5)}`; + if (key.startsWith('Cmd+')) + spec.accelerator = `Ctrl+${key.substring(4)}`; + if (key.startsWith('Alt+')) + spec.accelerator = `Alt+${key.substring(4)}`; + if (key.startsWith('Meta+')) + spec.accelerator = `Ctrl+Alt+${key.substring(5)}`; break; } } @@ -361,10 +385,10 @@ export function addMenuItem(custom: CustomMenuItemSpec) { } else { if (!spec.click && !spec.role) spec.click = ( - _item: Electron.MenuItem, - window: Electron.BrowserWindow, - _evt: Electron.KeyboardEvent, - ) => window.webContents.send('dome.ipc.menu.clicked', id); + _item: MenuItem, + window: BrowserWindow | undefined, + _evt: KeyboardEvent, + ) => window?.webContents.send('dome.ipc.menu.clicked', id); customItems.set(id, { spec }); menuSpec.push(spec); } @@ -392,14 +416,31 @@ function template(): CustomMenu[] { return ([] as CustomMenu[]).concat( [ { label: app.name, submenu: macosAppMenuItems(app.name) }, - { label: 'File', submenu: fileMenuItems_custom }, - { label: 'Edit', submenu: concatSep(editMenuItems, editMenuItems_custom) }, - { label: 'View', submenu: concatSep(viewMenuItems_custom, viewMenuItems(true)) }, + { + label: 'File', + submenu: fileMenuItemsCustom, + }, + { + label: 'Edit', + submenu: concatSep(editMenuItems, editMenuItemsCustom), + }, + { + label: 'View', + submenu: concatSep(viewMenuItemsCustom, viewMenuItems(true)), + }, ], customMenus, [ - { label: 'Window', role: 'window', submenu: windowMenuItems_macos }, - { label: 'Help', role: 'help', submenu: helpMenuItems }, + { + label: 'Window', + role: 'window', + submenu: windowMenuItemsMacos, + }, + { + label: 'Help', + role: 'help', + submenu: helpMenuItems, + }, ], ); case 'windows': @@ -407,13 +448,22 @@ function template(): CustomMenu[] { default: return ([] as CustomMenu[]).concat( [ - { label: 'File', submenu: concatSep(fileMenuItems_custom, fileMenuItems_linux) }, - { label: 'Edit', submenu: concatSep(editMenuItems, editMenuItems_custom) }, - { label: 'View', submenu: concatSep(viewMenuItems_custom, viewMenuItems(false)) }, + { + label: 'File', + submenu: concatSep(fileMenuItemsCustom, fileMenuItemsLinux), + }, + { + label: 'Edit', + submenu: concatSep(editMenuItems, editMenuItemsCustom), + }, + { + label: 'View', + submenu: concatSep(viewMenuItemsCustom, viewMenuItems(false)), + }, ], customMenus, [ - { label: 'Window', submenu: windowMenuItems_linux }, + { label: 'Window', submenu: windowMenuItemsLinux }, { label: 'Help', submenu: helpMenuItems }, ], ); @@ -445,12 +495,55 @@ export function install() { // Called by reload above function reset() { - fileMenuItems_custom.length = 0; - editMenuItems_custom.length = 0; - viewMenuItems_custom.length = 0; + fileMenuItemsCustom.length = 0; + editMenuItemsCustom.length = 0; + viewMenuItemsCustom.length = 0; customMenus.length = 0; customItems.clear(); install(); } // -------------------------------------------------------------------------- +// --- Popup Menu Management +// -------------------------------------------------------------------------- + +interface PopupMenuItemProps { + /** Item label. */ + label: string; + /** Optional menu identifier. */ + id?: string; + /** Displayed item, default is `true`. */ + display?: boolean; + /** Enabled item, default is `true`. */ + enabled?: boolean; + /** Checked item, default is `false`. */ + checked?: boolean; +} + +type PopupMenuItem = PopupMenuItemProps | 'separator'; + +function handlePopupMenu(_: Event, items: PopupMenuItem[]): Promise<number> { + return new Promise((resolve) => { + const menu = new Menu(); + let kid = 0; + let selected = (-1); + items.forEach((item, index) => { + if (item === 'separator') + menu.append(new MenuItem({ type: 'separator' })); + else if (item) { + const { display = true, enabled, checked } = item; + if (display) { + const label = item.label || `#${++kid}`; + const click = () => { selected = index; }; + const type = checked !== undefined ? 'checkbox' : 'normal'; + menu.append(new MenuItem({ label, enabled, type, checked, click })); + } + } + }); + menu.popup({ callback: () => resolve(selected) }); + }); +} + +ipcMain.handle('dome.popup', handlePopupMenu); + +// -------------------------------------------------------------------------- diff --git a/ivette/src/dome/misc/system.ts b/ivette/src/dome/misc/system.ts index 99bcf87c156d06697c1cf614b40227f90fc06f62..32f9f791e638f162eef39a887f829debeba1f3da 100644 --- a/ivette/src/dome/misc/system.ts +++ b/ivette/src/dome/misc/system.ts @@ -36,9 +36,6 @@ import Emitter from 'events'; import Exec from 'child_process'; import fspath from 'path'; import fs from 'fs'; -import { app, remote } from 'electron'; - -declare const __static: string; // -------------------------------------------------------------------------- // --- Platform Specificities @@ -121,32 +118,11 @@ export function doExit() { let COMMAND_WDIR = '.'; let COMMAND_ARGV: string[] = []; -function SET_COMMAND(argv: string[], wdir: string) { +function setCommandLine(argv: string[], wdir: string) { COMMAND_ARGV = argv; COMMAND_WDIR = wdir; } -// -------------------------------------------------------------------------- -// --- User's Directories -// -------------------------------------------------------------------------- - -const appProxy = app || remote.app; - -/** Returns user's home directory. */ -export function getHome() { return appProxy.getPath('home'); } - -/** Returns user's desktop directory. */ -export function getDesktop() { return appProxy.getPath('desktop'); } - -/** Returns user's documents directory. */ -export function getDocuments() { return appProxy.getPath('documents'); } - -/** Returns user's downloads directory. */ -export function getDownloads() { return appProxy.getPath('downloads'); } - -/** Returns temporary directory. */ -export function getTempDir() { return appProxy.getPath('temp'); } - /** Working directory (Application Window). @@ -177,17 +153,6 @@ export function getPID() { return process.pid; } */ export function getArguments() { return COMMAND_ARGV; } -/** Returns path of static assets. - - Returns the path to the associated `./static/<...path>` of your - application. The `./static/` directory is automatically packed - into your application by Dome thanks to `electron-webpack` default - configuration. -*/ -export function getStatic(...path: string[]) { - return fspath.join(__static, ...path); -} - // -------------------------------------------------------------------------- // --- File Join // -------------------------------------------------------------------------- @@ -308,14 +273,10 @@ export function exists(path: string) { /** Reads a textual file contents. - Promisified - [Node `fs.readFile`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_readfile_path_options_callback) - using `UTF-8` encoding. + Promisified `fs.readFile` using `utf-8` encoding. */ export function readFile(path: string): Promise<string> { - return new Promise((result, reject) => { - fs.readFile(path, 'UTF-8', (err, data) => (err ? reject(err) : result(data))); - }); + return fs.promises.readFile(path, { encoding: 'utf-8' }); } // -------------------------------------------------------------------------- @@ -325,14 +286,10 @@ export function readFile(path: string): Promise<string> { /** Writes a textual content in a file. - Promisified - [Node `fs.writeFile`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_writefile_file_data_options_callback) - using `UTF-8` encoding. + Promisified `fs.writeFile` using `utf-8` encoding. */ -export function writeFile(path: string, content: string): Promise<void> { - return new Promise((result, reject) => { - fs.writeFile(path, content, 'UTF-8', (err) => (err ? reject(err) : result())); - }); +export async function writeFile(path: string, content: string): Promise<void> { + return fs.promises.writeFile(path, content, { encoding: 'utf-8' }); } // -------------------------------------------------------------------------- @@ -344,14 +301,10 @@ export function writeFile(path: string, content: string): Promise<void> { @param srcPath - the source file path @param tgtPath - the target file path - Promisified - [Node `fs.copyFile`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_copyfile_src_dest_flags_callback) - using `UTF-8` encoding. + Promisified `fs.copyFile`. */ -export function copyFile(srcPath: string, tgtPath: string): Promise<void> { - return new Promise((result, reject) => { - fs.copyFile(srcPath, tgtPath, (err) => (err ? reject(err) : result())); - }); +export async function copyFile(srcPath: string, tgtPath: string): Promise<void> { + return fs.promises.copyFile(srcPath, tgtPath); } // -------------------------------------------------------------------------- @@ -362,24 +315,15 @@ export function copyFile(srcPath: string, tgtPath: string): Promise<void> { Reads a directory. @returns directory contents (local names) - Promisified - [Node `fs.readdir`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_readdir_path_options_callback). + Promisified `fs.readdir`. - Uses `UTF-8` encoding to obtain (relative) file names instead of byte buffers. On MacOS, `.DS_Store` entries - are filtered out. + Uses `utf-8` encoding to obtain (relative) file names instead of byte buffers. + On MacOS, `.DS_Store` entries are filtered out. */ -export function readDir(path: string): Promise<string[]> { +export async function readDir(path: string): Promise<string[]> { const filterDir = (f: string) => f !== '.DS_Store'; - return new Promise((result, reject) => { - fs.readdir( - path, - { encoding: 'UTF-8', withFileTypes: true }, - (err: NodeJS.ErrnoException | null, files: fs.Dirent[]) => { - if (err) reject(err); - else result(files.map((fn) => fn.name).filter(filterDir)); - }, - ); - }); + const entries = await fs.promises.readdir(path, { encoding: 'utf-8', withFileTypes: true }); + return entries.map((fn) => fn.name).filter(filterDir); } // -------------------------------------------------------------------------- @@ -441,7 +385,8 @@ async function rmDirRec(path: string): Promise<void> { try { const stats = fs.statSync(path); if (stats.isFile()) { - return remove(path); + await remove(path); + return; } if (stats.isDirectory()) { const rmDirSub = (name: string) => { @@ -506,9 +451,9 @@ atExit(() => { export type StdPipe = { path?: string | undefined; mode?: number; pipe?: boolean }; export type StdOptions = undefined | 'null' | 'ignore' | 'pipe' | StdPipe; -type stdio = { io: number | 'pipe' | 'ignore' | 'ipc'; fd?: number }; +type StdIO = { io: number | 'pipe' | 'ignore' | 'ipc'; fd?: number }; -function stdSpec(spec: StdOptions, isOutput: boolean): stdio { +function stdSpec(spec: StdOptions, isOutput: boolean): StdIO { switch (spec) { case undefined: return { io: isOutput ? 'pipe' : 'ignore' }; @@ -533,7 +478,7 @@ interface Readable { function pipeTee(std: Readable, fd: number) { if (!fd) return; - const out = fs.createWriteStream('<ignored>', { fd, encoding: 'UTF-8' }); + const out = fs.createWriteStream('<ignored>', { fd, encoding: 'utf-8' }); out.on('error', (err) => { console.warn('[Dome] can not pipe:', err); std.unpipe(out); @@ -627,11 +572,11 @@ export function spawn( const err = child.stderr; if (out && stdout.fd) { - out.setEncoding('UTF-8'); + out.setEncoding('utf-8'); pipeTee(out, stdout.fd); } if (err && stderr.fd) { - err.setEncoding('UTF-8'); + err.setEncoding('utf-8'); pipeTee(err, stderr.fd); } @@ -651,7 +596,7 @@ const WINDOW_PREFERENCES_ARGV = '--dome-preferences-window'; // -------------------------------------------------------------------------- export default { - SET_COMMAND, + setCommandLine, WINDOW_APPLICATION_ARGV, WINDOW_PREFERENCES_ARGV, }; diff --git a/ivette/src/dome/misc/utils.ts b/ivette/src/dome/misc/utils.ts index b15ff61229e284e6c022a5eea04f439168e90176..2d896660ba950b8c98dc056b8910638dea42ab12 100644 --- a/ivette/src/dome/misc/utils.ts +++ b/ivette/src/dome/misc/utils.ts @@ -31,9 +31,9 @@ import type { CSSProperties } from 'react'; -type falsy = undefined | boolean | null | ''; +type Falsy = undefined | boolean | null | ''; -export type ClassSpec = string | falsy | { [cname: string]: true | falsy }; +export type ClassSpec = string | Falsy | { [cname: string]: true | Falsy }; /** Utility function to merge various HTML class properties @@ -75,7 +75,7 @@ export function classes( return buffer.join(' '); } -export type StyleSpec = falsy | CSSProperties; +export type StyleSpec = Falsy | CSSProperties; /** Utility function to merge various CSS style properties diff --git a/ivette/src/dome/renderer/controls/buttons.tsx b/ivette/src/dome/renderer/controls/buttons.tsx index 85e2b5a79f40f80bd6a2f2ded689b351202cef79..6e47c4e88b3493f5dd0afd4fdd419939cea99911 100644 --- a/ivette/src/dome/renderer/controls/buttons.tsx +++ b/ivette/src/dome/renderer/controls/buttons.tsx @@ -32,7 +32,6 @@ import React from 'react'; import { classes } from 'dome/misc/utils'; import { Icon } from './icons'; -import { LabelProps } from './labels'; import './style.css'; interface EVENT { @@ -48,68 +47,6 @@ const TRIGGER = (onClick?: () => void) => (evt?: EVENT) => { if (onClick) onClick(); }; -// -------------------------------------------------------------------------- -// --- LCD -// -------------------------------------------------------------------------- - -/** Button-like label. */ -export function LCD(props: LabelProps) { - const className = classes( - 'dome-xButton dome-xBoxButton dome-text-code dome-xButton-lcd ', - props.className, - ); - return ( - <label - className={className} - title={props.title} - style={props.style} - > - {props.icon && <Icon id={props.icon} />} - {props.label} - {props.children} - </label> - ); -} - -// -------------------------------------------------------------------------- -// --- Led -// -------------------------------------------------------------------------- - -export type LEDstatus = - undefined | 'inactive' | 'active' | 'positive' | 'negative' | 'warning'; - -export interface LEDprops { - /** - Led status: - - `'inactive'`: off (default) - - `'active'`: blue color - - `'positive'`: green color - - `'negative'`: red color - - `'warning'`: orange color - */ - status?: LEDstatus; - /** Blinking Led (default: `false`). */ - blink?: boolean; - /** Tooltip text. */ - title?: string; - /** Additional CSS class. */ - className?: string; - /** Additional CSS style. */ - style?: React.CSSProperties; -} - -export const LED = (props: LEDprops) => { - const className = classes( - 'dome-xButton-led', - `dome-xButton-led-${props.status || 'inactive'}`, - props.blink && 'dome-xButton-blink', - props.className, - ); - return ( - <div className={className} title={props.title} style={props.style} /> - ); -}; - // -------------------------------------------------------------------------- // --- Button // -------------------------------------------------------------------------- @@ -138,7 +75,7 @@ const LABEL = ({ disabled, label }: LABELprops) => ( ); export type ButtonKind = - 'default' | 'active' | 'primary' | 'warning' | 'positive' | 'negative'; + 'default' | 'primary' | 'warning' | 'positive' | 'negative'; export interface ButtonProps { /** Text of the label. Prepend to other children elements. */ @@ -169,7 +106,6 @@ export interface ButtonProps { focusable?: boolean; /** Styled bytton: - `'default'`: normal button; - - `'active'`: active normal button; - `'primary'`: primary button, in blue; - `'warning'`: warning button, in orange; - `'positive'`: positive button, in green; @@ -558,15 +494,13 @@ export interface SelectProps { * <optgroup label='…'>…</optgroup> * <option value='…' disabled=… >…</option> - **Warning:** most non-positionning CSS properties might not - work on the`<select>` element due to the native rendering used - by Chrome. - You might use `-webkit-appearance: none` to cancel this behavior, - you will have to restyle the - component entirely, which is quite ugly by default. */ export function Select(props: SelectProps) { - const { onChange, className = '', placeholder } = props; + const { onChange, placeholder } = props; + const className = classes( + 'dome-xSelect dome-xBoxButton dome-xButton-default dome-xButton-label', + props.className, + ); const disabled = onChange ? DISABLED(props) : true; const callback = (evt: React.ChangeEvent<HTMLSelectElement>) => { if (onChange) onChange(evt.target.value); @@ -575,7 +509,7 @@ export function Select(props: SelectProps) { <select id={props.id} disabled={disabled} - className={`dome - xSelect ${className} `} + className={className} style={props.style} title={props.title} value={props.value} @@ -583,7 +517,7 @@ export function Select(props: SelectProps) { > {placeholder && <option value="">— {placeholder} —</option>} {props.children} - </select> + </select > ); } diff --git a/ivette/src/dome/renderer/controls/displays.tsx b/ivette/src/dome/renderer/controls/displays.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1a0586bc6db844d6f8d6b0faa22d59e8d7c6cac3 --- /dev/null +++ b/ivette/src/dome/renderer/controls/displays.tsx @@ -0,0 +1,145 @@ +/* ************************************************************************ */ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/* ************************************************************************ */ + +// -------------------------------------------------------------------------- +// --- LEDs, LCD, meters, etc. +// -------------------------------------------------------------------------- + +/** + @packageDocumentation + @module dome/controls/displays + */ + +import React from 'react'; +import { classes } from 'dome/misc/utils'; +import { Icon } from './icons'; +import { LabelProps } from './labels'; +import './style.css'; + +// -------------------------------------------------------------------------- +// --- LCD +// -------------------------------------------------------------------------- + +/** Button-like label. */ +export function LCD(props: LabelProps) { + const className = classes( + 'dome-xButton dome-xBoxButton dome-text-code dome-xButton-lcd ', + props.className, + ); + return ( + <label + className={className} + title={props.title} + style={props.style} + > + {props.icon && <Icon id={props.icon} />} + {props.label} + {props.children} + </label> + ); +} + +// -------------------------------------------------------------------------- +// --- Led +// -------------------------------------------------------------------------- + +export type LEDstatus = + undefined | 'inactive' | 'active' | 'positive' | 'negative' | 'warning'; + +export interface LEDprops { + /** + Led status: + - `'inactive'`: off (default) + - `'active'`: blue color + - `'positive'`: green color + - `'negative'`: red color + - `'warning'`: orange color + */ + status?: LEDstatus; + /** Blinking Led (default: `false`). */ + blink?: boolean; + /** Tooltip text. */ + title?: string; + /** Additional CSS class. */ + className?: string; + /** Additional CSS style. */ + style?: React.CSSProperties; +} + +export const LED = (props: LEDprops) => { + const className = classes( + 'dome-xButton-led', + `dome-xButton-led-${props.status || 'inactive'}`, + props.blink && 'dome-xButton-blink', + props.className, + ); + return ( + <div className={className} title={props.title} style={props.style} /> + ); +}; + +// -------------------------------------------------------------------------- +// --- Metter +// -------------------------------------------------------------------------- + +export interface MeterProps { + /** Additional CSS class. */ + className?: string; + /** Additional CSS style. */ + style?: React.CSSProperties; + /** Disabled control. */ + /** Meter value. Undefined means disabled. */ + value: number; /** default is undefined */ + min?: number; /** default is 0.0 */ + low?: number; /** default is 0.0 */ + high?: number; /** default is 1.0 */ + max?: number; /** default is 1.0 */ + optimum?: number | 'LOW' | 'MEDIUM' | 'HIGH'; /** default is undefined */ +} + +export const Meter = (props: MeterProps) => { + const { className, style, value, optimum, ...ms } = props; + const min = props.min ?? 0.0; + const max = props.max ?? 1.0; + const low = props.low ?? min; + const hight = props.high ?? max; + const theClass = classes('dome-xMeter', className); + let opt: number | undefined; + if (value !== undefined) + switch (optimum) { + case 'LOW': opt = (min + low) / 2; break; + case 'MEDIUM': opt = (low + hight) / 2; break; + case 'HIGH': opt = (hight + max) / 2; break; + default: opt = optimum; + } + const mv = value === undefined ? min : Math.min(max, Math.max(min, value)); + return ( + <meter + className={theClass} + style={style} + value={mv} + optimum={opt} + {...ms} /> + ); +}; + +// -------------------------------------------------------------------------- diff --git a/ivette/src/dome/renderer/controls/icons.tsx b/ivette/src/dome/renderer/controls/icons.tsx index 14017179215c3071143bc8e6f61f60ead863d901..aa336cb6d4cefbd9a2f023910fa5c0899919cab0 100644 --- a/ivette/src/dome/renderer/controls/icons.tsx +++ b/ivette/src/dome/renderer/controls/icons.tsx @@ -25,9 +25,11 @@ // -------------------------------------------------------------------------- /** - Consult the [Icon Gallery](../guides/icons.md.html) for default icons. You can [register](#.register) new icons or override existing ones and [iterate](#.forEach) over the icon base. + + [[include:icons.md]] + @packageDocumentation @module dome/controls/icons */ diff --git a/ivette/src/dome/renderer/controls/style.css b/ivette/src/dome/renderer/controls/style.css index ffbf1cabcf280cee2b4a4a612cc1b7f35e096128..a7c192a15d462a89ed9982b5c848ea6c5a0a3b0e 100644 --- a/ivette/src/dome/renderer/controls/style.css +++ b/ivette/src/dome/renderer/controls/style.css @@ -248,6 +248,38 @@ background: radial-gradient( circle at center , #ffc749 , #ecd44f ); } +/* -------------------------------------------------------------------------- */ +/* --- Styling Meters --- */ +/* -------------------------------------------------------------------------- */ + + +meter.dome-xMeter { + background: white; + border-radius: 5px; + box-shadow: + 0 0 4px 4px rgba(0,0,0,0.15) inset; + height: 16px; + width: 70px; +} + +meter.dome-xMeter::-webkit-meter-bar { + background: transparent; + border-radius: 5px; + height: 14px; +} + +meter.dome-xMeter::-webkit-meter-optimum-value { + background: linear-gradient(to bottom, #4a0 0%, #8f0 20%, #4a0 100%); +} + +meter.dome-xMeter::-webkit-meter-suboptimum-value { + background: linear-gradient(to bottom, #aa0 0%, #ff0 20%, #aa0 100%); +} + +meter.dome-xMeter::-webkit-meter-even-less-good-value { + background: linear-gradient(to bottom, #a40 0%, #f80 20%, #a40 100%); +} + /* -------------------------------------------------------------------------- */ /* --- Styling Checkbox --- */ /* -------------------------------------------------------------------------- */ diff --git a/ivette/src/dome/renderer/data/compare.ts b/ivette/src/dome/renderer/data/compare.ts index 26dc17956720dfca5419f5034286885d1f83baa3..5254f927550462a91c12d75b8b62874f67756b57 100644 --- a/ivette/src/dome/renderer/data/compare.ts +++ b/ivette/src/dome/renderer/data/compare.ts @@ -56,10 +56,10 @@ export const isEqual = FastCompare; export function equal(_x: any, _y: any): 0 { return 0; } /** Primitive comparison works on this type. */ -export type bignum = bigint | number; +export type BigNum = bigint | number; /** Detect Non-NaN numbers and big-ints. */ -export function isBigNum(x: any): x is bignum { +export function isBigNum(x: any): x is BigNum { return ( (typeof (x) === 'bigint') || (typeof (x) === 'number' && !Number.isNaN(x)) @@ -91,7 +91,7 @@ export const string: Order<string> = primitive; /** Primitive comparison for (big) integers (non NaN numbers included). */ -export const bignum: Order<bignum> = primitive; +export const bignum: Order<BigNum> = primitive; /** Primitive comparison for number (NaN included). @@ -291,13 +291,13 @@ export function byAllFields<A>(order: ByAllFields<A>): Order<A> { }; } -export type dict<A> = undefined | null | { [key: string]: A }; +export type Dict<A> = undefined | null | { [key: string]: A }; /** Compare dictionaries _wrt_ lexicographic order of entries. */ -export function dictionary<A>(order: Order<A>): Order<dict<A>> { - return (x: dict<A>, y: dict<A>) => { +export function dictionary<A>(order: Order<A>): Order<Dict<A>> { + return (x: Dict<A>, y: Dict<A>) => { if (x === y) return 0; const dx = x ?? {}; const dy = y ?? {}; @@ -398,29 +398,31 @@ export function tuple5<A, B, C, D, E>( // --- Structural Comparison // -------------------------------------------------------------------------- +/* eslint-disable no-shadow */ + /** @internal */ -enum RANK { +enum IRANK { UNDEFINED, BOOLEAN, SYMBOL, NAN, BIGNUM, STRING, - ARRAY, OBJECT, FUNCTION + ARRAY, OBJECT, FUNCTION, } /** @internal */ -function rank(x: any): RANK { +function rank(x: any): IRANK { const t = typeof x; switch (t) { - case 'undefined': return RANK.UNDEFINED; - case 'boolean': return RANK.BOOLEAN; - case 'symbol': return RANK.SYMBOL; + case 'undefined': return IRANK.UNDEFINED; + case 'boolean': return IRANK.BOOLEAN; + case 'symbol': return IRANK.SYMBOL; case 'number': - return Number.isNaN(x) ? RANK.NAN : RANK.BIGNUM; + return Number.isNaN(x) ? IRANK.NAN : IRANK.BIGNUM; case 'bigint': - return RANK.BIGNUM; - case 'string': return RANK.STRING; - case 'function': return RANK.FUNCTION; + return IRANK.BIGNUM; + case 'string': return IRANK.STRING; + case 'function': return IRANK.FUNCTION; case 'object': - return Array.isArray(x) ? RANK.ARRAY : RANK.OBJECT; + return Array.isArray(x) ? IRANK.ARRAY : IRANK.OBJECT; } } diff --git a/ivette/src/dome/renderer/data/json.ts b/ivette/src/dome/renderer/data/json.ts index b848fc1671087713f5c981e4b718cf85a3012a64..1d0a52ad8928d2ba45d11b8d1259e2532fed246a 100644 --- a/ivette/src/dome/renderer/data/json.ts +++ b/ivette/src/dome/renderer/data/json.ts @@ -32,6 +32,8 @@ import { DEVEL } from 'dome/system'; +/* eslint-disable @typescript-eslint/naming-convention, no-shadow */ + export type json = undefined | null | boolean | number | string | json[] | { [key: string]: json }; diff --git a/ivette/src/dome/renderer/dialogs.tsx b/ivette/src/dome/renderer/dialogs.tsx index bbdda3f02693deb736dca5a2a21142fb060662a7..c117832f27061f605a8e595c6b99d1692b2345b9 100644 --- a/ivette/src/dome/renderer/dialogs.tsx +++ b/ivette/src/dome/renderer/dialogs.tsx @@ -27,7 +27,7 @@ */ import filepath from 'path'; -import { remote } from 'electron'; +import { ipcRenderer } from 'electron'; import * as System from 'dome/system'; // -------------------------------------------------------------------------- @@ -122,10 +122,9 @@ export async function showMessageBox<A>( if (cancelId === defaultId) cancelId = -1; - return remote.dialog.showMessageBox( - remote.getCurrentWindow(), + return ipcRenderer.invoke('dome.dialog.showMessageBox', { - type: kind, + 'type': kind, message, detail: details, defaultId, @@ -197,8 +196,7 @@ export async function showOpenFile( props: OpenFileProps, ): Promise<string | undefined> { const { title, label, path, hidden = false, filters } = props; - return remote.dialog.showOpenDialog( - remote.getCurrentWindow(), + return ipcRenderer.invoke('dome.dialog.showOpenDialog', { title, buttonLabel: label, @@ -221,8 +219,7 @@ export async function showOpenFiles( ): Promise<string[] | undefined> { const { title, label, path, hidden, filters } = props; - return remote.dialog.showOpenDialog( - remote.getCurrentWindow(), + return ipcRenderer.invoke('dome.dialog.showOpenDialog', { title, buttonLabel: label, @@ -258,8 +255,7 @@ export async function showSaveFile( props: SaveFileProps, ): Promise<string | undefined> { const { title, label, path, filters } = props; - return remote.dialog.showSaveDialog( - remote.getCurrentWindow(), + return ipcRenderer.invoke('dome.dialog.showSaveDialog', { title, buttonLabel: label, @@ -292,8 +288,7 @@ export async function showOpenDir( default: break; } - return remote.dialog.showOpenDialog( - remote.getCurrentWindow(), + return ipcRenderer.invoke('dome.dialog.showOpenDialog', { title, buttonLabel: label, diff --git a/ivette/src/dome/renderer/dome.tsx b/ivette/src/dome/renderer/dome.tsx index 0edda413386105a2b24ff69313cb8dc09149229b..4caa280dbd62740277421d9460d89ef636f62786 100644 --- a/ivette/src/dome/renderer/dome.tsx +++ b/ivette/src/dome/renderer/dome.tsx @@ -42,7 +42,7 @@ import _ from 'lodash'; import React from 'react'; import ReactDOM from 'react-dom'; import { AppContainer } from 'react-hot-loader'; -import { remote, ipcRenderer } from 'electron'; +import { ipcRenderer } from 'electron'; import SYS, * as System from 'dome/system'; import * as Json from 'dome/data/json'; import * as Settings from 'dome/data/settings'; @@ -77,14 +77,50 @@ export type PlatformKind = 'linux' | 'macos' | 'windows'; /** System platform. */ export const platform: PlatformKind = (System.platform as PlatformKind); +// -------------------------------------------------------------------------- +// --- User's Directories +// -------------------------------------------------------------------------- + +let loadedPaths = false; +const remoteAppPaths: { [index: string]: string } = {}; + +function getPath(k: string): string { + if (!loadedPaths) { + loadedPaths = true; + Object.assign(remoteAppPaths, ipcRenderer.sendSync('dome.app.paths')); + } + return remoteAppPaths[k]; +} + +/** Returns user's home directory. */ +export function getHome() { return getPath('home'); } + +/** Returns user's desktop directory. */ +export function getDesktop() { return getPath('desktop'); } + +/** Returns user's documents directory. */ +export function getDocuments() { return getPath('documents'); } + +/** Returns user's downloads directory. */ +export function getDownloads() { return getPath('downloads'); } + +/** Returns temporary directory. */ +export function getTempDir() { return getPath('temp'); } + +/** Working directory (Application Window). */ +export function getWorkingDir() { return System.getWorkingDir(); } + +/** Current process ID.. */ +export function getPID() { return System.getPID(); } + // -------------------------------------------------------------------------- // --- Application Emitter // -------------------------------------------------------------------------- /** Typed Dome Event. - To register an event with no argument, simply use `new Event('myEvent')`. -*/ + To register an event with no argument, simply use `new Event('myEvent')`. + */ export class Event<A = void> { private name: string; @@ -168,7 +204,7 @@ export function onCommand( } ipcRenderer.on('dome.ipc.command', (_event, argv, wdir) => { - SYS.SET_COMMAND(argv, wdir); + SYS.setCommandLine(argv, wdir); System.emitter.emit('dome.command', argv, wdir); }); @@ -467,29 +503,27 @@ export function popupMenu( items: PopupMenuItem[], callback?: (item: string | undefined) => void, ) { - const { Menu, MenuItem } = remote; - const menu = new Menu(); - let selected = ''; - let kid = 0; - items.forEach((item) => { - if (item === 'separator') - menu.append(new MenuItem({ type: 'separator' })); - else if (item) { - const { display = true, enabled, checked } = item; - if (display) { - const label = item.label || `#${++kid}`; - const id = item.id || label; - const click = () => { - selected = id; - if (item.onClick) item.onClick(); - }; - const type = checked !== undefined ? 'checkbox' : 'normal'; - menu.append(new MenuItem({ label, enabled, type, checked, click })); - } + const ipcItems = items.map((item) => { + if (!item) return undefined; + if (item === 'separator') return item; + return { + label: item.label, + id: item.id, + display: !!(item.display ?? true), + enabled: !!(item.enabled ?? true), + checked: !!(item.checked ?? false), + }; + }); + ipcRenderer.invoke('dome.popup', ipcItems).then((index: number) => { + const item = items[index]; + if (item && item !== 'separator') { + const { id, label, onClick } = item; + if (onClick) onClick(); + if (callback) callback(id || label); + } else { + if (callback) callback(undefined); } }); - const job = callback ? () => callback(selected) : undefined; - menu.popup({ window: remote.getCurrentWindow(), callback: job }); } // -------------------------------------------------------------------------- diff --git a/ivette/src/dome/renderer/errors.tsx b/ivette/src/dome/renderer/errors.tsx index b424ac4ec8832ee2af4999653b2c70f7c83f9bd9..a955124cf33a9dd76ad9d008f1b1e4b27c765555 100644 --- a/ivette/src/dome/renderer/errors.tsx +++ b/ivette/src/dome/renderer/errors.tsx @@ -60,7 +60,7 @@ interface CatchState { /** React Error Boundaries. */ -export class Catch extends React.Component<CatchProps, CatchState, {}> { +export class Catch extends React.Component<CatchProps, CatchState, unknown> { constructor(props: CatchProps) { super(props); diff --git a/ivette/src/dome/renderer/frame/sidebars.tsx b/ivette/src/dome/renderer/frame/sidebars.tsx index 7cbe2a4c7478fd2f3534070287e833d49fff7bc1..ab00240d36aeedf21f565b28fd781f1cb442fe2f 100644 --- a/ivette/src/dome/renderer/frame/sidebars.tsx +++ b/ivette/src/dome/renderer/frame/sidebars.tsx @@ -68,7 +68,7 @@ export function SideBar(props: SideBarProps) { // -------------------------------------------------------------------------- export type BadgeElt = undefined | null | string | number | React.ReactNode; -export type Badge = BadgeElt | BadgeElt[]; +export type Badges = BadgeElt | BadgeElt[]; const makeBadgeElt = (elt: BadgeElt): React.ReactNode => { if (elt === undefined || elt === null) return null; @@ -81,7 +81,7 @@ const makeBadgeElt = (elt: BadgeElt): React.ReactNode => { } }; -const makeBadge = (elt: Badge): React.ReactNode => { +const makeBadge = (elt: Badges): React.ReactNode => { if (Array.isArray(elt)) return elt.map(makeBadgeElt); return makeBadgeElt(elt); @@ -120,7 +120,7 @@ export interface SectionProps { /** Disabled sections are made unvisible. */ disabled?: boolean; /** Badge summary (only visible when folded). */ - summary?: Badge; + summary?: Badges; /** Right-click callback. */ onContextMenu?: () => void; /** Section contents. */ @@ -182,7 +182,7 @@ export interface ItemProps { /** Item tooltip text. */ title?: string; /** Badge. */ - badge?: Badge; + badge?: Badges; /** Enabled item. */ enabled?: boolean; /** Disabled item (dimmed). */ diff --git a/ivette/src/dome/renderer/frame/style.css b/ivette/src/dome/renderer/frame/style.css index 4f7d144cae66f93d3117171f781da10a11fe86b4..4e20866b1726d61b58c0e684813743c6da07939e 100644 --- a/ivette/src/dome/renderer/frame/style.css +++ b/ivette/src/dome/renderer/frame/style.css @@ -252,7 +252,7 @@ } .dome-xToolBar-vrule { - width: 2px ; + width: 1px ; position: relative ; left: 4px ; height: 18px ; diff --git a/ivette/src/dome/renderer/frame/toolbars.tsx b/ivette/src/dome/renderer/frame/toolbars.tsx index 6064de0c647d07e2fae893a4d307073c0c37c6fc..25c1c067ebd2919c46fd200bbb1ec0e3e5b46c45 100644 --- a/ivette/src/dome/renderer/frame/toolbars.tsx +++ b/ivette/src/dome/renderer/frame/toolbars.tsx @@ -31,7 +31,6 @@ import React from 'react'; import { Event, useEvent, find } from 'dome'; -import { debounce } from 'lodash'; import { SVG } from 'dome/controls/icons'; import { Label } from 'dome/controls/labels'; import { classes } from 'dome/misc/utils'; @@ -95,12 +94,6 @@ const KIND = (kind: undefined | string) => ( kind ? ` dome-xToolBar-${kind}` : '' ); -interface SELECT<A> { - selected?: boolean; - selection?: A; - value?: A; -} - export type ButtonKind = | 'default' | 'cancel' | 'warning' | 'positive' | 'negative'; @@ -268,6 +261,12 @@ export interface SearchFieldProps<A> { event?: null | Event<void>; } +interface Searching { + pattern?: string; + timer?: NodeJS.Timeout | undefined; + onSearch?: ((p: string) => void); +} + /** Search Bar. */ @@ -277,18 +276,24 @@ export function SearchField<A = undefined>(props: SearchFieldProps<A>) { const focus = () => inputRef.current?.focus(); const [value, setValue] = React.useState(''); const [index, setIndex] = React.useState(-1); + const searching = React.useRef<Searching>({}); const { onHint, onSelect, onSearch, hints = [] } = props; // Find event trigger useEvent(props.event ?? find, focus); // Lookup trigger - const triggerLookup = React.useCallback( - debounce((pattern: string) => { - if (onSearch) onSearch(pattern); - }, DEBOUNCED_SEARCH), - [onSearch], - ); + const triggerLookup = React.useCallback((pattern: string) => { + const s = searching.current; + s.pattern = pattern; + s.onSearch = onSearch; + if (!s.timer) { + s.timer = setTimeout(() => { + s.timer = undefined; + if (s.onSearch && s.pattern) s.onSearch(s.pattern); + }, DEBOUNCED_SEARCH); + } + }, [onSearch]); // Blur Event const onBlur = () => { diff --git a/ivette/src/dome/renderer/layout/forms.tsx b/ivette/src/dome/renderer/layout/forms.tsx index 86183586e91b5cbd51902f9cbe389a1bc3430244..1bd3c06935a48214c072342350ffdf49b80e3992 100644 --- a/ivette/src/dome/renderer/layout/forms.tsx +++ b/ivette/src/dome/renderer/layout/forms.tsx @@ -45,12 +45,12 @@ import * as Utils from 'dome/misc/utils'; import { SVG } from 'dome/controls/icons'; import { Checkbox, Radio, Select as SelectMenu } from 'dome/controls/buttons'; -export type Error = +export type FieldError = | undefined | boolean | string - | { [key: string]: Error } | Error[]; -export type Checker<A> = (value: A) => boolean | Error; -export type Callback<A> = (value: A, error: Error) => void; -export type FieldState<A> = [A, Error, Callback<A>]; + | { [key: string]: FieldError } | FieldError[]; +export type Checker<A> = (value: A) => boolean | FieldError; +export type Callback<A> = (value: A, error: FieldError) => void; +export type FieldState<A> = [A, FieldError, Callback<A>]; /* --------------------------------------------------------------------------*/ /* --- State Errors Utilities ---*/ @@ -66,28 +66,28 @@ export function inRange( export function validate<A>( value: A, checker: undefined | Checker<A>, -): Error { +): FieldError { if (checker) { try { const r = checker(value); if (r === undefined || r === true) return undefined; return r; } catch (err) { - return err.toString() || false; + return `${err}`; } } return undefined; } -export function isValid(err: Error): boolean { return !err; } +export function isValid(err: FieldError): boolean { return !err; } -type ObjectError = { [key: string]: Error }; +type ObjectError = { [key: string]: FieldError }; -function isObjectError(err: Error): err is ObjectError { +function isObjectError(err: FieldError): err is ObjectError { return typeof err === 'object' && !Array.isArray(err); } -function isArrayError(err: Error): err is Error[] { +function isArrayError(err: FieldError): err is FieldError[] { return Array.isArray(err); } @@ -99,7 +99,7 @@ function isValidObject(err: ObjectError): boolean { return true; } -function isValidArray(err: Error[]): boolean { +function isValidArray(err: FieldError[]): boolean { for (let k = 0; k < err.length; k++) { if (!isValid(err[k])) return false; } @@ -117,8 +117,8 @@ export function useState<A>( onChange?: Callback<A>, ): FieldState<A> { const [value, setValue] = React.useState<A>(defaultValue); - const [error, setError] = React.useState<Error>(undefined); - const setState = React.useCallback((newValue: A, newError: Error) => { + const [error, setError] = React.useState<FieldError>(undefined); + const setState = React.useCallback((newValue: A, newError: FieldError) => { const localError = validate(newValue, checker) || newError; setValue(newValue); setError(localError); @@ -133,9 +133,9 @@ export function useValid<A>( ): FieldState<A> { const [value, setValue] = state; const [local, setLocal] = React.useState(value); - const [error, setError] = React.useState<Error>(undefined); + const [error, setError] = React.useState<FieldError>(undefined); const update = React.useCallback( - (newValue: A, newError: Error) => { + (newValue: A, newError: FieldError) => { setLocal(newValue); setError(newError); if (!newError) setValue(newValue); @@ -162,7 +162,7 @@ export function useDefined<A>( ): FieldState<A | undefined> { const [value, error, setState] = state; const update = React.useCallback( - (newValue: A | undefined, newError: Error) => { + (newValue: A | undefined, newError: FieldError) => { if (newValue !== undefined) { setState(newValue, newError); } @@ -182,7 +182,7 @@ export function useRequired<A>( const [value, error, setState] = state; const cache = React.useRef(value); const update = React.useCallback( - (newValue: A | undefined, newError: Error) => { + (newValue: A | undefined, newError: FieldError) => { if (newValue === undefined) { setState(cache.current, onError || 'Required field'); } else { @@ -202,7 +202,7 @@ export function useChecker<A>( checker?: Checker<A>, ): FieldState<A> { const [value, error, setState] = state; - const update = React.useCallback((newValue: A, newError: Error) => { + const update = React.useCallback((newValue: A, newError: FieldError) => { const localError = validate(newValue, checker) || newError; setState(newValue, localError); }, [checker, setState]); @@ -235,11 +235,11 @@ export function useFilter<A, B>( const [value, error, setState] = state; const [localValue, setLocalValue] = React.useState(defaultValue); - const [localError, setLocalError] = React.useState<Error>(undefined); + const [localError, setLocalError] = React.useState<FieldError>(undefined); const [dangling, setDangling] = React.useState(false); const update = React.useCallback( - (newValue: B, newError: Error) => { + (newValue: B, newError: FieldError) => { try { const outValue = output(newValue); setLocalValue(newValue); @@ -250,7 +250,7 @@ export function useFilter<A, B>( } } catch (err) { setLocalValue(newValue); - setLocalError(newError || err.toString() || 'Invalid value'); + setLocalError(newError || err ? `${err}` : 'Invalid value'); setDangling(true); } }, [output, setState, setLocalValue, setLocalError], @@ -262,7 +262,7 @@ export function useFilter<A, B>( try { return [input(value), error, update]; } catch (err) { - return [localValue, err.toString() || 'Invalid input', update]; + return [localValue, err ? `${err}` : 'Invalid input', update]; } } @@ -284,12 +284,12 @@ export function useLatency<A>( const update = React.useMemo(() => { if (period > 0) { const propagate = debounce( - (lateValue: A, lateError: Error) => { + (lateValue: A, lateError: FieldError) => { setState(lateValue, lateError); setDangling(false); }, period, ); - return (newValue: A, newError: Error) => { + return (newValue: A, newError: FieldError) => { setLocalValue(newValue); setLocalError(newError); setDangling(true); @@ -315,7 +315,7 @@ export function useProperty<A, K extends keyof A>( checker?: Checker<A[K]>, ): FieldState<A[K]> { const [value, error, setState] = state; - const update = React.useCallback((newProp: A[K], newError: Error) => { + const update = React.useCallback((newProp: A[K], newError: FieldError) => { const newValue = { ...value, [property]: newProp }; const objError = isObjectError(error) ? error : {}; const propError = validate(newProp, checker) || newError; @@ -334,7 +334,7 @@ export function useIndex<A>( checker?: Checker<A>, ): FieldState<A> { const [array, error, setState] = state; - const update = React.useCallback((newValue: A, newError: Error) => { + const update = React.useCallback((newValue: A, newError: FieldError) => { const newArray = array.slice(); newArray[index] = newValue; const localError = isArrayError(error) ? error.slice() : []; @@ -436,7 +436,7 @@ export interface WarningProps { /** Short warning message (displayed on hover). */ warning?: string; /** Error details (if a string is provided, in tooltip). */ - error?: Error; + error?: FieldError; /** Label offset. */ offset?: number; } @@ -494,7 +494,7 @@ export interface SectionProps extends FilterProps, Children { /** Warning Error (when unfolded). */ warning?: string; /** Associated Error. */ - error?: Error; + error?: FieldError; /** Fold/Unfold settings. */ settings?: string; /** Fold/Unfold state (defaults to false). */ @@ -550,7 +550,7 @@ export interface GenericFieldProps extends FilterProps, Children { /** Warning message (in case of error). */ onError?: string; /** Error (if any). */ - error?: Error; + error?: FieldError; } let FIELDID = 0; @@ -626,7 +626,7 @@ export interface FieldProps<A> extends FilterProps { } type InputEvent = { target: { value: string } }; -type InputState = [string, Error, (evt: InputEvent) => void]; +type InputState = [string, FieldError, (evt: InputEvent) => void]; function useChangeEvent(setState: Callback<string>) { return React.useCallback( @@ -635,17 +635,6 @@ function useChangeEvent(setState: Callback<string>) { ); } -function useTextInputField( - props: TextFieldProps, - defaultLatency: number, -): InputState { - const checked = useChecker(props.state, props.checker); - const period = props.latency ?? defaultLatency; - const [value, error, setState] = useLatency(checked, period); - const onChange = useChangeEvent(setState); - return [value || '', error, onChange]; -} - /* --------------------------------------------------------------------------*/ /* --- Text Fields ---*/ /* --------------------------------------------------------------------------*/ @@ -658,6 +647,17 @@ export interface TextFieldProps extends FieldProps<string | undefined> { latency?: number; } +function useTextInputField( + props: TextFieldProps, + defaultLatency: number, +): InputState { + const checked = useChecker(props.state, props.checker); + const period = props.latency ?? defaultLatency; + const [value, error, setState] = useLatency(checked, period); + const onChange = useChangeEvent(setState); + return [value || '', error, onChange]; +} + /** Text Field. @category Text Fields diff --git a/ivette/src/dome/renderer/table/arrays.ts b/ivette/src/dome/renderer/table/arrays.ts index 95e459ab91b91191763dc4b94e575d70bfba4522..5dc126e4f907fc72493ad5d6f9403f6f71f2c7c0 100644 --- a/ivette/src/dome/renderer/table/arrays.ts +++ b/ivette/src/dome/renderer/table/arrays.ts @@ -43,13 +43,13 @@ import { export type ByColumns<Row> = { [dataKey: string]: Compare.Order<Row> }; -interface PACK<Key, Row> { +export interface PACK<Key, Row> { index: number | undefined; key: Key; row: Row; } -type SORT<K, R> = Order<PACK<K, R>>; +export type SORT<K, R> = Order<PACK<K, R>>; function orderBy<K, R>( columns: ByColumns<R>, diff --git a/ivette/src/dome/renderer/table/views.tsx b/ivette/src/dome/renderer/table/views.tsx index 2c63f9793913c048788823025728365a01006a13..55fddd2c7461206b42cea9c972f658e6e6fa487b 100644 --- a/ivette/src/dome/renderer/table/views.tsx +++ b/ivette/src/dome/renderer/table/views.tsx @@ -206,8 +206,8 @@ interface PopupItem { type PopupMenu = ('separator' | PopupItem)[]; type Cmap<A> = Map<string, A>; -type Cprops = ColProps<any>; type ColProps<R> = ColumnProps<R, any>; +type Cprops = ColProps<any>; // -------------------------------------------------------------------------- // --- Column Utilities @@ -239,8 +239,8 @@ function makeRowGetter<Key, Row>(model?: Model<Key, Row>) { } function makeDataGetter( - getter: ((row: any, dataKey: string) => any) = defaultGetter, dataKey: string, + getter: ((row: any, dataKey: string) => any) = defaultGetter, ): TableCellDataGetter { return (({ rowData }) => { try { @@ -644,7 +644,7 @@ class TableState<Key, Row> { computeGetter(id: string, dataKey: string, props: Cprops) { const current = this.getter.get(id); if (current) return current; - const dataGetter = makeDataGetter(props.getter, dataKey); + const dataGetter = makeDataGetter(dataKey, props.getter); this.getter.set(id, dataGetter); return dataGetter; } diff --git a/ivette/src/dome/renderer/text/buffers.ts b/ivette/src/dome/renderer/text/buffers.ts index 712089fa924a872903f7903c867cd41b43dfdecd..50a6ad1310797c6245412ab99154be2f56354c21 100644 --- a/ivette/src/dome/renderer/text/buffers.ts +++ b/ivette/src/dome/renderer/text/buffers.ts @@ -113,6 +113,8 @@ function byVisibleTag(lmin: number, lmax: number) { // --- Buffer // -------------------------------------------------------------------------- +export type TextMarker = CodeMirror.TextMarker<CodeMirror.MarkerRange>; + export interface RichTextBufferProps { /** @@ -184,7 +186,7 @@ export class RichTextBuffer extends Emitter { private cssmarkers = new Map<string, CSSMarker>(); // Indexed by marker user identifier - private textmarkers = new Map<string, CodeMirror.TextMarker[]>(); + private textmarkers = new Map<string, TextMarker[]>(); private decorator?: Decorator; private edited = false; @@ -327,7 +329,7 @@ export class RichTextBuffer extends Emitter { /** Lookup for the text markers associated with a marker identifier. Remove the marked tags from the buffered tag array. */ - findTextMarker(id: string): CodeMirror.TextMarker[] { + findTextMarker(id: string): TextMarker[] { this.doFlushText(); this.bufferedTags.forEach((tg, idx) => { if (tg?.id === id) { @@ -470,8 +472,10 @@ export class RichTextBuffer extends Emitter { let line = Infinity; this.findTextMarker(position).forEach((tm) => { const rg = tm.find(); - const ln = rg.from.line; - if (ln < line) line = ln; + if (rg && rg.from) { + const ln = rg.from.line; + if (ln < line) line = ln; + } }); if (line !== Infinity) this.emit('scroll', line); @@ -497,7 +501,7 @@ export class RichTextBuffer extends Emitter { private onChange( _editor: CodeMirror.Editor, - change: CodeMirror.EditorChangeLinkedList, + change: CodeMirror.EditorChange, ) { if (change.origin !== 'buffer') { this.setEdited(true); diff --git a/ivette/src/dome/renderer/text/editors.tsx b/ivette/src/dome/renderer/text/editors.tsx index ffa7c9193c00ea62ad7f9aebe63099b80cfc1a5e..cb9036dc52f980dcf660d3c4ee9db864a12b0722 100644 --- a/ivette/src/dome/renderer/text/editors.tsx +++ b/ivette/src/dome/renderer/text/editors.tsx @@ -386,7 +386,7 @@ class CodeMirrorWrapper extends React.Component<TextProps> { // --- Focus // -------------------------------------------------------------------------- - handleKey(_cm: CodeMirror.Editor, key: string, _evt: KeyboardEvent) { + handleKey(_cm: CodeMirror.Editor, key: string, _evt: Event) { switch (key) { case 'Esc': this.props.buffer?.setFocused(false); diff --git a/ivette/src/dome/template/makefile.packages b/ivette/src/dome/template/makefile.packages index 34a494d77320ff171a14873d6eb15b4456e9bbc0..72e46b988425f140e03588c687b63acca23b4b39 100644 --- a/ivette/src/dome/template/makefile.packages +++ b/ivette/src/dome/template/makefile.packages @@ -3,24 +3,26 @@ # -------------------------------------------------------------------------- DOME_DEV_PACKAGES= \ - @babel/core@^7 \ + @babel/core \ @babel/preset-env \ @babel/preset-react \ @babel/plugin-proposal-object-rest-spread \ - electron@^7 \ + electron@^16 \ electron-builder \ electron-webpack \ electron-devtools-installer \ - webpack \ + webpack@^4 \ babel-loader \ - css-loader \ - react-hot-loader \ - @hot-loader/react-dom \ - @types/react + css-loader@^5 \ + react-hot-loader@^4 \ + @hot-loader/react-dom@^16 \ + @types/react@^16 \ + @types/react-dom@^16 \ + @types/react-virtualized@^9.21.0 DOME_APP_PACKAGES= \ - react@^16.8 \ - react-dom \ + react@^16 \ + react-dom@^16 \ source-map-support \ lodash \ react-virtualized \ diff --git a/ivette/src/dome/template/webpack.renderer.js b/ivette/src/dome/template/webpack.renderer.js index 864a8c6f71c1e6ba1d72e6cbf97a3f5b24517179..eba1bbf48cef90b38258b81882fd3aced83a1dca 100644 --- a/ivette/src/dome/template/webpack.renderer.js +++ b/ivette/src/dome/template/webpack.renderer.js @@ -55,6 +55,11 @@ module.exports = { 'dome': path.resolve( DOME , 'renderer' ), 'react-dom': '@hot-loader/react-dom' } + }, + devServer: { + watchOptions: { + ignored: '**/.#*' + } } } ; diff --git a/ivette/src/frama-c/client.ts b/ivette/src/frama-c/client.ts new file mode 100644 index 0000000000000000000000000000000000000000..15b8e1cbe379313ee2c076e3b0fa76905f26a32f --- /dev/null +++ b/ivette/src/frama-c/client.ts @@ -0,0 +1,148 @@ +/* ************************************************************************ */ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/* ************************************************************************ */ + +import Emitter from 'events'; +import { json } from 'dome/data/json'; + +// -------------------------------------------------------------------------- +// --- Frama-C Server Access (Client side) +// -------------------------------------------------------------------------- + +export abstract class Client { + + /** Server CLI */ + abstract commandLine(sockaddr: string, params: string[]): string[]; + + /** Connection */ + abstract connect(addr: string): void; + + /** Disconnection */ + abstract disconnect(): void; + + /** Send Request */ + abstract send(kind: string, id: string, request: string, data: any): void; + + /** Signal ON */ + abstract sigOn(id: string): void; + + /** Signal ON */ + abstract sigOff(id: string): void; + + /** Kill Request */ + abstract kill(id: string): void; + + /** Polling */ + abstract poll(): void; + + /** Shutdown the server */ + abstract shutdown(): void; + + /** @internal */ + private events = new Emitter(); + + // -------------------------------------------------------------------------- + // --- DATA Event + // -------------------------------------------------------------------------- + + /** Request data callback */ + onData(callback: (id: string, data: json) => void): void { + this.events.on('DATA', callback); + } + + /** @internal */ + emitData(id: string, data: json): void { + this.events.emit('DATA', id, data); + } + + // -------------------------------------------------------------------------- + // --- REJECTED Event + // -------------------------------------------------------------------------- + + /** Rejected request callback */ + onRejected(callback: (id: string) => void): void { + this.events.on('REJECTED', callback); + } + + /** @internal */ + emitRejected(id: string): void { + this.events.emit('REJECTED', id); + } + + // -------------------------------------------------------------------------- + // --- ERROR Event + // -------------------------------------------------------------------------- + + /** Rejected request callback */ + onError(callback: (id: string, msg: string) => void): void { + this.events.on('ERROR', callback); + } + + /** @internal */ + emitError(id: string, msg: string): void { + this.events.emit('ERROR', id, msg); + } + + // -------------------------------------------------------------------------- + // --- KILLED Event + // -------------------------------------------------------------------------- + + /** Killed request callback */ + onKilled(callback: (id: string) => void): void { + this.events.on('KILLED', callback); + } + + /** @internal */ + emitKilled(id: string): void { + this.events.emit('KILLED', id); + } + + // -------------------------------------------------------------------------- + // --- SIGNAL Event + // -------------------------------------------------------------------------- + + /** Signal callback */ + onSignal(callback: (id: string) => void): void { + this.events.on('SIGNAL', callback); + } + + /** @internal */ + emitSignal(id: string): void { + this.events.emit('SIGNAL', id); + } + + // -------------------------------------------------------------------------- + // --- CONNECT Event + // -------------------------------------------------------------------------- + + /** Connection callback */ + onConnect(callback: (err?: Error) => void): void { + this.events.on('CONNECT', callback); + } + + /** @internal */ + emitConnect(err?: Error): void { + this.events.emit('CONNECT', err); + } + +} + +// -------------------------------------------------------------------------- diff --git a/ivette/src/frama-c/client_socket.ts b/ivette/src/frama-c/client_socket.ts new file mode 100644 index 0000000000000000000000000000000000000000..755b7cbd77074742523e356d75a0003cb2d8bd74 --- /dev/null +++ b/ivette/src/frama-c/client_socket.ts @@ -0,0 +1,207 @@ +/* ************************************************************************ */ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/* ************************************************************************ */ + +import Net from 'net'; +import { Debug } from 'dome'; +import { json } from 'dome/data/json'; +import { Client } from './client'; + +const D = new Debug('SocketServer'); + +const RETRIES = 10; +const TIMEOUT = 200; + +// -------------------------------------------------------------------------- +// --- Frama-C Server API +// -------------------------------------------------------------------------- + +class SocketClient extends Client { + + retries = 0; + running = false; + socket: Net.Socket | undefined; + timer: NodeJS.Timeout | undefined; + queue: json[] = []; + buffer: Buffer = Buffer.from(''); + + /** Server CLI */ + commandLine(sockaddr: string, params: string[]): string[] { + return ['-server-socket', sockaddr, '-then'].concat(params); + } + + /** Connection */ + connect(sockaddr: string): void { + this.retries++; + if (this.socket) { + this.socket.destroy(); + } + if (this.timer) { + clearTimeout(this.timer); + this.timer = undefined; + } + const s = Net.createConnection(sockaddr, () => { + this.running = true; + this.retries = 0; + this.emitConnect(); + this._flush(); + }); + // Using Buffer data encoding at this level + s.on('end', () => this.disconnect()); + s.on('data', (data: Buffer) => this._receive(data)); + s.on('error', (err: Error) => { + s.destroy(); + if (this.retries <= RETRIES && !this.running) { + this.socket = undefined; + this.timer = setTimeout(() => this.connect(sockaddr), TIMEOUT); + } else { + this.running = false; + this.emitConnect(err); + } + }); + this.socket = s; + } + + disconnect(): void { + this.queue = []; + this.retries = 0; + this.running = false; + if (this.timer) { + clearTimeout(this.timer); + this.timer = undefined; + } + if (this.socket) { + this.socket.destroy(); + this.socket = undefined; + } + } + + /** Send Request */ + send(kind: string, id: string, request: string, data: any): void { + this.queue.push({ cmd: kind, id, request, data }); + this._flush(); + } + + /** Signal ON */ + sigOn(id: string): void { + this.queue.push({ cmd: 'SIGON', id }); + this._flush(); + } + + /** Signal ON */ + sigOff(id: string): void { + this.queue.push({ cmd: 'SIGOFF', id }); + this._flush(); + } + + /** Kill Request */ + kill(id: string): void { + this.queue.push({ cmd: 'KILL', id }); + this._flush(); + } + + /** Polling */ + poll(): void { + this.queue.push('POLL'); + this._flush(); + } + + /** Shutdown the server */ + shutdown(): void { + this.queue.push('SHUTDOWN'); + this._flush(); + } + + // -------------------------------------------------------------------------- + // --- Low-Level Management + // -------------------------------------------------------------------------- + + _flush() { + if (this.running) { + this.queue.forEach((cmd) => { + this._send(Buffer.from(JSON.stringify(cmd), 'utf8')); + }); + this.queue = []; + } + } + + _send(data: Buffer) { + const s = this.socket; + if (s) { + const len = data.length; + const hex = Number(len).toString(16).toUpperCase(); + const padding = '0000000000000000'; + const header = + len <= 0xFFF ? 'S' + padding.substring(hex.length, 3) : + len <= 0xFFFFFFF ? 'L' + padding.substring(hex.length, 7) : + 'W' + padding.substring(hex.length, 15); + s.write(Buffer.from(header + hex)); + s.write(data); + } + } + + _fetch(): undefined | string { + const msg = this.buffer; + const len = msg.length; + if (len < 1) return; + const hd = msg.readInt8(0); + // 'S': 83, 'L': 76, 'W': 87 + const phex = hd == 83 ? 4 : hd == 76 ? 8 : 16; + if (len < phex) return; + const size = Number.parseInt(msg.slice(1, phex).toString('ascii'), 16); + const offset = phex + size; + if (len < offset) return; + this.buffer = msg.slice(offset); + return msg.slice(phex, offset).toString('utf8'); + } + + _receive(chunk: Buffer) { + this.buffer = Buffer.concat([this.buffer, chunk]); + while (true) { + const n0 = this.buffer.length; + const data = this._fetch(); + const n1 = this.buffer.length; + if (data === undefined || n0 <= n1) break; + try { + const cmd: any = JSON.parse(data); + if (cmd !== null && typeof (cmd) === 'object') { + switch (cmd.res) { + case 'DATA': this.emitData(cmd.id, cmd.data); break; + case 'ERROR': this.emitError(cmd.id, cmd.msg); break; + case 'KILLED': this.emitKilled(cmd.id); break; + case 'REJECTED': this.emitRejected(cmd.id); break; + case 'SIGNAL': this.emitSignal(cmd.id); break; + default: + D.warn('Unknown command', cmd); + } + } else + D.warn('Misformed data', data); + } catch (err) { + D.warn('Misformed JSON', data, err); + } + } + } + +} + +export const client: Client = new SocketClient(); + +// -------------------------------------------------------------------------- diff --git a/ivette/src/frama-c/client_zmq.ts b/ivette/src/frama-c/client_zmq.ts new file mode 100644 index 0000000000000000000000000000000000000000..afe15ed62ded72b5fdda167e682fed7e1b19b7ea --- /dev/null +++ b/ivette/src/frama-c/client_zmq.ts @@ -0,0 +1,204 @@ +/* ************************************************************************ */ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/* ************************************************************************ */ + +import * as ZMQ from 'zeromq'; +import { Debug } from 'dome'; +import { Client } from './client'; + +const D = new Debug('ZmqServer'); + +// -------------------------------------------------------------------------- +// --- Frama-C Server API +// -------------------------------------------------------------------------- + +class ZmqClient extends Client { + + queue: string[] = []; + zmqSocket: ZMQ.Socket | undefined; + zmqIsBusy = false; + + /** Server CLI */ + commandLine(sockaddr: string, params: string[]): string[] { + return ['-server-zmq', `ipc://${sockaddr}`, '-then'].concat(params); + } + + /** Connection */ + connect(sockaddr: string): void { + if (this.zmqSocket) { + this.zmqSocket.close(); + } + this.zmqSocket = new ZMQ.Socket('req'); + this.zmqIsBusy = false; + this.zmqSocket.connect(`ipc://${sockaddr}`); + this.zmqSocket.on('message', (msg: string[]) => this._receive(msg)); + } + + disconnect(): void { + this.zmqIsBusy = false; + this.queue = []; + if (this.zmqSocket) { + this.zmqSocket.close(); + this.zmqSocket = undefined; + } + } + + /** Send Request */ + send(kind: string, id: string, request: string, data: any): void { + if (this.zmqSocket) { + this.queue.push(kind, id, request, data); + this._flush(); + } + } + + /** Signal ON */ + sigOn(id: string): void { + if (this.zmqSocket) { + this.queue.push('SIGON', id); + this._flush(); + } + } + + /** Signal ON */ + sigOff(id: string): void { + if (this.zmqSocket) { + this.queue.push('SIGOFF', id); + this._flush(); + } + } + + /** Kill Request */ + kill(id: string): void { + if (this.zmqSocket) { + this.queue.push('KILL', id); + this._flush(); + } + } + + /** Polling */ + poll(): void { + if (this.zmqSocket && this.queue.length == 0) { + this.queue.push('POLL'); + } + this._flush(); + } + + /** Shutdown the server */ + shutdown(): void { + this.queue = []; + if (this.zmqSocket) { + this.queue.push('SHUTDOWN'); + this._flush(); + } + } + + // -------------------------------------------------------------------------- + // --- Low-Level Management + // -------------------------------------------------------------------------- + + _flush() { + const socket = this.zmqSocket; + if (socket) { + const cmds = this.queue; + if (cmds && !this.zmqIsBusy) { + try { + this.queue = []; + socket.send(cmds); + this.zmqIsBusy = true; + } catch (err) { + D.error('ZmqSocket', err); + this.zmqIsBusy = false; + } + } + } else { + this.queue = []; + } + } + + _receive(resp: string[]) { + try { + this._decode(resp); + } catch (err) { + D.error('ZmqSocket', err); + } finally { + this.zmqIsBusy = false; + setImmediate(() => this._flush()); + } + } + + /* eslint-disable @typescript-eslint/indent */ + _decode(resp: string[]) { + const shift = () => resp.shift() ?? ''; + while (resp.length) { + const cmd = shift(); + switch (cmd) { + case 'NONE': + break; + case 'DATA': + { + const rid = shift(); + const data = JSON.parse(shift()); + this.emitData(rid, data); + } + break; + case 'KILLED': + { + const rid = shift(); + this.emitKilled(rid); + } + break; + case 'ERROR': + { + const rid = shift(); + const msg = shift(); + this.emitError(rid, msg); + } + break; + case 'REJECTED': + { + const rid = shift(); + this.emitRejected(rid); + } + break; + case 'SIGNAL': + { + const rid = shift(); + this.emitSignal(rid); + } + break; + case 'WRONG': + { + const err = shift(); + D.error(`ZMQ Protocol Error: ${err}`); + } + break; + default: + D.error(`Unknown Response: ${cmd}`); + return; + } + } + } + +} + +export const client: Client = new ZmqClient(); + +// -------------------------------------------------------------------------- diff --git a/ivette/src/frama-c/kernel/ASTview.tsx b/ivette/src/frama-c/kernel/ASTview.tsx index 76879dcfca9675d4aa1aeffa73711ae6ac734aac..a925d593f89e13bb061e2fa50be05b93d9c5f879 100644 --- a/ivette/src/frama-c/kernel/ASTview.tsx +++ b/ivette/src/frama-c/kernel/ASTview.tsx @@ -186,9 +186,11 @@ export default function ASTview() { const markers = buffer.findTextMarker(prop.key); markers.forEach((marker) => { const pos = marker.find(); - buffer.forEach((cm) => { - cm.setGutterMarker(pos.from.line, 'bullet', bullet); - }); + if (pos) { + buffer.forEach((cm) => { + cm.setGutterMarker(pos.from.line, 'bullet', bullet); + }); + } }); } } diff --git a/ivette/src/frama-c/kernel/Globals.tsx b/ivette/src/frama-c/kernel/Globals.tsx index 6c94aedd8590d7a3f1b80d699a6f1fadaa192c48..49799d3ef0f8e4f249f6e7c6a4f4b3bf85909a4a 100644 --- a/ivette/src/frama-c/kernel/Globals.tsx +++ b/ivette/src/frama-c/kernel/Globals.tsx @@ -119,7 +119,7 @@ export default () => { function isSelected(fct: functionsData) { return multipleSelection?.allSelections.some( - (l) => fct.name === l?.fct + (l) => fct.name === l?.fct, ); } diff --git a/ivette/src/frama-c/kernel/Messages.tsx b/ivette/src/frama-c/kernel/Messages.tsx index c215c943ff3f962b846f3ef0854654311c94df12..a02c18dbddb70cf6f226fe835dac952050e360cd 100644 --- a/ivette/src/frama-c/kernel/Messages.tsx +++ b/ivette/src/frama-c/kernel/Messages.tsx @@ -53,7 +53,7 @@ interface Search { } type KindFilter = Record<logkind, boolean>; -type PluginFilter = {[key: string]: boolean}; +type PluginFilter = { [key: string]: boolean }; type EmitterFilter = { kernel: boolean; plugins: PluginFilter; @@ -80,23 +80,23 @@ const kindFilter: KindFilter = { /* The fields must be exactly the short names of Frama-C plugins used in messages. They are all shown by default. */ const pluginFilter: PluginFilter = { - aorai: true, - dive: true, + 'aorai': true, + 'dive': true, 'e-acsl': true, - eva: true, - from: true, - impact: true, - inout: true, - metrics: true, - nonterm: true, - pdg: true, - report: true, - rte: true, - scope: true, - server: true, - slicing: true, - variadic: true, - wp: true, + 'eva': true, + 'from': true, + 'impact': true, + 'inout': true, + 'metrics': true, + 'nonterm': true, + 'pdg': true, + 'report': true, + 'rte': true, + 'scope': true, + 'server': true, + 'slicing': true, + 'variadic': true, + 'wp': true, }; const emitterFilter = { @@ -168,7 +168,7 @@ function searchString(search: string | undefined, msg: string) { function filterSearched(search: Search, msg: Message) { return (searchString(search.message, msg.message) && - searchCategory(search.category, msg.category)); + searchCategory(search.category, msg.category)); } function filterFunction(filter: Filter, kf: string | undefined, msg: Message) { @@ -179,20 +179,15 @@ function filterFunction(filter: Filter, kf: string | undefined, msg: Message) { function filterMessage(filter: Filter, kf: string | undefined, msg: Message) { return (filterFunction(filter, kf, msg) && - filterSearched(filter.search, msg) && - filterKind(filter.kind, msg) && - filterEmitter(filter.emitter, msg)); + filterSearched(filter.search, msg) && + filterKind(filter.kind, msg) && + filterEmitter(filter.emitter, msg)); } // -------------------------------------------------------------------------- // --- Filters panel and ratio // -------------------------------------------------------------------------- -function Checkbox(p: Forms.CheckboxFieldProps) { - const lbl = p.label.charAt(0).toUpperCase() + p.label.slice(1).toLowerCase(); - return <Forms.CheckboxField label={lbl} state={p.state} />; -} - function Section(p: Forms.SectionProps) { const settings = `ivette.messages.filter.${p.label}`; return ( @@ -202,28 +197,45 @@ function Section(p: Forms.SectionProps) { ); } -function MessageFilter(props: {filter: State<Filter>}) { +function Checkbox(p: Forms.CheckboxFieldProps) { + const lbl = p.label.charAt(0).toUpperCase() + p.label.slice(1).toLowerCase(); + return <Forms.CheckboxField label={lbl} state={p.state} />; +} + +function MessageKindCheckbox(props: { + kind: logkind, + kindState: Forms.FieldState<KindFilter>, +}) { + const { kind, kindState } = props; + const state = Forms.useProperty(kindState, kind); + return <Checkbox label={kind} state={state} />; +} + +function PluginCheckbox(props: { + plugin: string, + pluginState: Forms.FieldState<PluginFilter>, +}) { + const state = Forms.useProperty(props.pluginState, props.plugin); + return <Checkbox label={props.plugin} state={state} />; +} + +function MessageFilter(props: { filter: State<Filter> }) { const state = Forms.useValid(props.filter); const search = Forms.useProperty(state, 'search'); const categoryState = Forms.useProperty(search, 'category'); const messageState = Forms.useProperty(search, 'message'); - - const kind = Forms.useProperty(state, 'kind'); - const kindState = (key: logkind) => Forms.useProperty(kind, key); + const kindState = Forms.useProperty(state, 'kind'); const kindCheckboxes = - Object.keys(kindFilter).map((key) => ( - <Checkbox key={key} label={key} state={kindState(key as logkind)} /> + Object.keys(kindFilter).map((k) => ( + <MessageKindCheckbox key={k} kind={k as logkind} kindState={kindState} /> )); - - const emitter = Forms.useProperty(state, 'emitter'); - function EmitterCheckbox(p: {key: 'kernel' | 'others'}) { - return <Checkbox label={p.key} state={Forms.useProperty(emitter, p.key)} />; - } - const plugin = Forms.useProperty(emitter, 'plugins'); - const pluginState = (key: string) => Forms.useProperty(plugin, key); + const emitterState = Forms.useProperty(state, 'emitter'); + const kernelState = Forms.useProperty(emitterState, 'kernel'); + const othersState = Forms.useProperty(emitterState, 'others'); + const pluginState = Forms.useProperty(emitterState, 'plugins'); const pluginCheckboxes = - Object.keys(pluginFilter).map((key) => ( - <Checkbox key={key} label={key} state={pluginState(key)} /> + Object.keys(pluginFilter).map((p) => ( + <PluginCheckbox key={p} plugin={p} pluginState={pluginState} /> )); return ( @@ -239,29 +251,29 @@ function MessageFilter(props: {filter: State<Filter>}) { state={categoryState} placeholder="Category" title={'Search in message category.\n' - + 'Use -<name> to hide some categories.'} + + 'Use -<name> to hide some categories.'} /> <Forms.TextField label="Message" state={messageState} placeholder="Message" title={'Search in message text.\n' - + 'Case-insensitive by default.\n' - + 'Use "text" for an exact case-sensitive search.'} + + 'Case-insensitive by default.\n' + + 'Use "text" for an exact case-sensitive search.'} /> </Section> <Section label="Kind"> - { kindCheckboxes } + {kindCheckboxes} </Section> <Section label="Emitter"> <div className="message-emitter-category"> - { EmitterCheckbox({ key: 'kernel' }) } + <Forms.CheckboxField label='Kernel' state={kernelState} /> </div> <div className="message-emitter-category"> - { pluginCheckboxes } + {pluginCheckboxes} </div> <div className="message-emitter-category"> - { EmitterCheckbox({ key: 'others' }) } + <Forms.CheckboxField label='Others' state={othersState} /> </div> </Section> </Forms.Page> diff --git a/ivette/src/frama-c/kernel/SourceCode.tsx b/ivette/src/frama-c/kernel/SourceCode.tsx index 4a55284e9eb085403daead8427f2142eab05ce87..a6100ca4aa4daf64774c17888f7e710fd9ddf319 100644 --- a/ivette/src/frama-c/kernel/SourceCode.tsx +++ b/ivette/src/frama-c/kernel/SourceCode.tsx @@ -90,10 +90,14 @@ export default function SourceCode() { }); // Updating the buffer content. - const errorMsg = () => { D.error(`Fail to load source code file ${file}`); }; - const onError = () => { if (file) errorMsg(); return ''; }; - const read = () => System.readFile(file).catch(onError); - const text = React.useMemo(read, [file, onError]); + const text = React.useMemo(async () => { + const onError = () => { + if (file) + D.error(`Fail to load source code file ${file}`); + return ''; + }; + return System.readFile(file).catch(onError); + }, [file]); const { result } = Dome.usePromise(text); React.useEffect(() => buffer.setValue(result), [buffer, result]); @@ -115,29 +119,31 @@ export default function SourceCode() { type position = CodeMirror.Position; type editor = CodeMirror.Editor; - async function select(editor: editor, event: MouseEvent) { - const pos = editor.coordsChar({ left: event.x, top: event.y }); - if (file === '' || !pos) return; - const arg = [file, pos.line + 1, pos.ch + 1]; - Server - .send(getMarkerAt, arg) - .then(([fct, marker]) => { - if (fct || marker) { - const location = { fct, marker } as States.Location; - selected.current = location; - updateSelection({ location }); - } - }) - .catch((err) => { - D.error(`Failed to get marker from source file position: ${err}`); - Status.setMessage({ - text: 'Failed request to Frama-C server', - kind: 'error', + const selectCallback = React.useCallback( + async function select(editor: editor, event: MouseEvent) { + const pos = editor.coordsChar({ left: event.x, top: event.y }); + if (file === '' || !pos) return; + const arg = [file, pos.line + 1, pos.ch + 1]; + Server + .send(getMarkerAt, arg) + .then(([fct, marker]) => { + if (fct || marker) { + const location = { fct, marker } as States.Location; + selected.current = location; + updateSelection({ location }); + } + }) + .catch((err) => { + D.error(`Failed to get marker from source file position: ${err}`); + Status.setMessage({ + text: 'Failed request to Frama-C server', + kind: 'error', + }); }); - }); - } + }, + [file, updateSelection], + ); - const selectCallback = React.useCallback(select, [file]); React.useEffect(() => { buffer.forEach((cm) => cm.on('mousedown', selectCallback)); return () => buffer.forEach((cm) => cm.off('mousedown', selectCallback)); diff --git a/ivette/src/frama-c/kernel/Status.tsx b/ivette/src/frama-c/kernel/Status.tsx index 14c31a6fd0e528abd4224c1a393865b1bf66f9ea..c65da88025a299d2f44aaf2d92c3574264854f30 100644 --- a/ivette/src/frama-c/kernel/Status.tsx +++ b/ivette/src/frama-c/kernel/Status.tsx @@ -21,48 +21,48 @@ /* ************************************************************************ */ /* --------------------------------------------------------------------------*/ -/* --- Frama-C Selection History ---*/ +/* --- Frama-C Status Message ---*/ /* --------------------------------------------------------------------------*/ import React from 'react'; import { Code } from 'dome/controls/labels'; -import { LED, IconButton } from 'dome/controls/buttons'; +import { IconButton } from 'dome/controls/buttons'; +import { LED } from 'dome/controls/displays'; import { Icon } from 'dome/controls/icons'; import * as Toolbars from 'dome/frame/toolbars'; import { GlobalState, useGlobalState } from 'dome/data/states'; +import * as Server from 'frama-c/server'; export type kind = 'none' | 'info' | 'warning' | 'error' | 'success' | 'progress'; -export interface Message { +export interface MessageProps { kind: kind; text: string; title?: string; } -const emptyMessage: Message = { text: '', kind: 'none' }; +const emptyMessage: MessageProps = { text: '', kind: 'none' }; const GlobalMessage = new GlobalState(emptyMessage); -export function setMessage(message: Message) { +export function setMessage(message: MessageProps) { GlobalMessage.setValue(message); } export default function Message() { const [message] = useGlobalState(GlobalMessage); - return ( <> <Toolbars.Space /> - { message.kind === 'progress' && <LED status="active" blink /> } - { message.kind === 'success' && <Icon id="CHECK" fill="green" /> } - { message.kind === 'warning' && <Icon id="ATTENTION" /> } - { message.kind === 'error' && <Icon id="CROSS" fill="red" /> } - { message.kind === 'info' && <Icon id="CIRC.INFO" /> } + {message.kind === 'progress' && <LED status="active" blink />} + {message.kind === 'success' && <Icon id="CHECK" fill="green" />} + {message.kind === 'warning' && <Icon id="ATTENTION" />} + {message.kind === 'error' && <Icon id="CROSS" fill="red" />} + {message.kind === 'info' && <Icon id="CIRC.INFO" />} <Code label={message.text} title={message.title} /> - <Toolbars.Space /> <IconButton - icon="CROSS" + icon="CIRC.CLOSE" onClick={() => setMessage(emptyMessage)} visible={message !== emptyMessage} title="Hide current message" @@ -72,4 +72,11 @@ export default function Message() { ); } +/* Callback on server events */ + +{ + Server.onReady(() => setMessage(emptyMessage)); + Server.onShutdown(() => setMessage(emptyMessage)); +} + /* --------------------------------------------------------------------------*/ diff --git a/ivette/src/frama-c/plugins/dive/index.tsx b/ivette/src/frama-c/plugins/dive/index.tsx index e121ae5a9b4a92bada905cc84a234f420a3f70e1..a1e890826be099025e3486dc2bcbd32624bb5ae2 100644 --- a/ivette/src/frama-c/plugins/dive/index.tsx +++ b/ivette/src/frama-c/plugins/dive/index.tsx @@ -217,10 +217,11 @@ class Dive { trigger: 'manual', appendTo: document.body, lazy: false, - onCreate: (instance: Tippy.Instance) => { + onCreate: (instance: any) => { const { popperInstance } = instance; - if (popperInstance) + if (popperInstance) { popperInstance.reference = (node as any).popperRef(); + } }, }; @@ -231,7 +232,8 @@ class Dive { ...common, content: node.data().values, placement: 'top', - distance: 10, + //distance: 10, + offset: [10, 10], arrow: true, })); } @@ -241,7 +243,8 @@ class Dive { ...common, content: node.data().type, placement: 'bottom', - distance: 20, + //distance: 20, + offset: [20, 20], theme: 'light-border', arrow: false, })); diff --git a/ivette/src/frama-c/plugins/eva/CoverageMeter.tsx b/ivette/src/frama-c/plugins/eva/CoverageMeter.tsx index 39537a19e5caa644252dad7992792ca5405b203c..fe709dea8cd16a3dac7fae2ba63998551318fddc 100644 --- a/ivette/src/frama-c/plugins/eva/CoverageMeter.tsx +++ b/ivette/src/frama-c/plugins/eva/CoverageMeter.tsx @@ -21,27 +21,29 @@ /* ************************************************************************ */ import React from 'react'; +import { Meter } from 'dome/controls/displays'; -export interface Coverage { +export interface CoverageProps { reachable: number; dead: number; } -export function percent(coverage: Coverage): string { +export function percent(coverage: CoverageProps): string { const q = coverage.reachable / (coverage.reachable + coverage.dead); return `${(q * 100).toFixed(1)}%`; } -export default function (props: {coverage: Coverage}) { +export default function(props: { coverage: CoverageProps }) { const { reachable, dead } = props.coverage; const total = reachable + dead; return ( - <meter + <Meter min={0} max={total} - low={0.8 * total} - optimum={total} + low={0.50 * total} + high={0.85 * total} + optimum='HIGH' value={reachable} /> ); diff --git a/ivette/src/frama-c/plugins/eva/Summary.tsx b/ivette/src/frama-c/plugins/eva/Summary.tsx index 0a48090a333743f2cb7e381f6ac695e34648d8ef..69e191ea73b54c70c24e2d94d7f9b10a697e4ee8 100644 --- a/ivette/src/frama-c/plugins/eva/Summary.tsx +++ b/ivette/src/frama-c/plugins/eva/Summary.tsx @@ -22,12 +22,11 @@ // React & Dome import React from 'react'; +import { LED } from 'dome/controls/displays'; import * as Ivette from 'ivette'; import * as States from 'frama-c/states'; import * as Eva from 'frama-c/api/plugins/eva/general'; -import { LED } from 'dome/controls/buttons'; - import CoverageMeter, { percent } from './CoverageMeter'; import './summary.css'; @@ -143,10 +142,10 @@ function Alarms(data: Eva.programStatsType, </tbody> </table> {invalid > 0 && ( - <div> - {invalid} of them {invalid === 1 ? 'is a' : 'are'} sure - alarm{plural(invalid)}. - </div> + <div> + {invalid} of them {invalid === 1 ? 'is a' : 'are'} sure + alarm{plural(invalid)}. + </div> )} </> ); diff --git a/ivette/src/frama-c/plugins/eva/probes.ts b/ivette/src/frama-c/plugins/eva/probes.ts index cf1dd2709e6bd697821d09cc51fb84bb4f9e6ad4..38c4497ead849d53c32e9129cb18beb805ee0bb6 100644 --- a/ivette/src/frama-c/plugins/eva/probes.ts +++ b/ivette/src/frama-c/plugins/eva/probes.ts @@ -52,7 +52,7 @@ function newLabel() { La = Ka; Lk++; } - return k > 0 ? lbl + k : lbl; + return k > 0 ? `${lbl}${k}` : lbl; } /* --------------------------------------------------------------------------*/ diff --git a/ivette/src/frama-c/plugins/eva/style.css b/ivette/src/frama-c/plugins/eva/style.css index 1c50e812941b6128854370387120cb115b8ded71..ff501a3802314aa94355c99da2995d3ccfa77a47 100644 --- a/ivette/src/frama-c/plugins/eva/style.css +++ b/ivette/src/frama-c/plugins/eva/style.css @@ -182,6 +182,7 @@ .eva-cell .eva-stmt { margin-left: 0.2em; + padding: 2px 0px; } .eva-cell-expression { diff --git a/ivette/src/frama-c/plugins/eva/valueinfos.tsx b/ivette/src/frama-c/plugins/eva/valueinfos.tsx index cd4d920d03361186691bafde4361d4ec3244eb0f..817e64e5f7560d9707fdf4096a5c6b33dfa8a167 100644 --- a/ivette/src/frama-c/plugins/eva/valueinfos.tsx +++ b/ivette/src/frama-c/plugins/eva/valueinfos.tsx @@ -48,9 +48,10 @@ interface StmtProps { } export function Stmt(props: StmtProps) { + const markersInfo = States.useSyncArray(Ast.markerInfo); + const { stmt, marker, short } = props; if (!stmt) return null; - const markersInfo = States.useSyncArray(Ast.markerInfo); const line = markersInfo.getData(marker)?.sloc?.line; const filename = markersInfo.getData(marker)?.sloc?.base; const title = markersInfo.getData(stmt)?.descr; diff --git a/ivette/src/frama-c/server.ts b/ivette/src/frama-c/server.ts index d13a5ab4b3fc1ccc80fea8317156c804fc8c9bd8..b96e18096ef47bafbb8e48a0e3e2cc1ffff3a49f 100644 --- a/ivette/src/frama-c/server.ts +++ b/ivette/src/frama-c/server.ts @@ -21,29 +21,24 @@ /* ************************************************************************ */ // -------------------------------------------------------------------------- -// --- Frama-C Server +// --- Connection to Frama-C Server // -------------------------------------------------------------------------- /** - * Manage the current Frama-C server/client interface - * @packageDocumentation - * @module frama-c/server + Manage the current Frama-C server/client interface + @packageDocumentation + @module frama-c/server */ -import _ from 'lodash'; +import { debounce } from 'lodash'; import React from 'react'; import * as Dome from 'dome'; import * as System from 'dome/system'; import * as Json from 'dome/data/json'; import { RichTextBuffer } from 'dome/text/buffers'; -import { Request as ZmqRequest } from 'zeromq'; import { ChildProcess } from 'child_process'; - -// -------------------------------------------------------------------------- -// --- Pretty Printing (Browser Console) -// -------------------------------------------------------------------------- - -const D = new Dome.Debug('Server'); +import { client } from './client_socket'; +//import { client } from './client_zmq'; // -------------------------------------------------------------------------- // --- Events @@ -88,7 +83,7 @@ export class SIGNAL extends Dome.Event { // -------------------------------------------------------------------------- /** Server stages. */ -export enum Stage { +export enum Status { /** Server is off. */ OFF = 'OFF', /** Server is starting, but not on yet. */ @@ -100,34 +95,7 @@ export enum Stage { /** Server is restarting. */ RESTARTING = 'RESTARTING', /** Server is off upon failure. */ - FAILURE = 'FAILURE' -} - -export interface OkStatus { - readonly stage: - Stage.OFF | Stage.ON | Stage.STARTING | Stage.RESTARTING | Stage.HALTING; -} - -export interface ErrorStatus { - readonly stage: Stage.FAILURE; - /** Failure message. */ - readonly error: string; -} - -export type Status = OkStatus | ErrorStatus; - -function okStatus( - s: Stage.OFF | Stage.ON | Stage.STARTING | Stage.RESTARTING | Stage.HALTING, -) { - return { stage: s }; -} - -function errorStatus(error: string): ErrorStatus { - return { stage: Stage.FAILURE, error }; -} - -export function hasErrorStatus(s: Status): s is ErrorStatus { - return (s as ErrorStatus).error !== undefined; + FAILURE = 'FAILURE', } // -------------------------------------------------------------------------- @@ -135,46 +103,29 @@ export function hasErrorStatus(s: Status): s is ErrorStatus { // -------------------------------------------------------------------------- /** The current server status. */ -let status: Status = okStatus(Stage.OFF); +let status: Status = Status.OFF; /** Request counter. */ let rqCount = 0; -type IndexedPair<T, U> = { - [index: string]: [T, U]; -}; - -type ResolvePromise = (value: Json.json) => void; -type RejectPromise = (error: Error) => void; - -/** Pending promise callbacks (pairs of (resolve, reject)). */ -let pending: IndexedPair<ResolvePromise, RejectPromise> = {}; - -/** Queue of server commands to be sent. */ -let queueCmd: string[] = []; - -/** Waiting request ids to be sent. */ -let queueId: string[] = []; - -/** Polling timeout and timer. */ -const pollingTimeout = 50; -let pollingTimer: NodeJS.Timeout | undefined; - -/** Flushing timer. */ -let flushingTimer: NodeJS.Immediate | undefined; +/** Pending Requests. */ +interface PendingRequest { + resolve: (data: Json.json) => void; + reject: (err?: string) => void; +} +const pending = new Map<string, PendingRequest>(); /** Server process. */ let process: ChildProcess | undefined; +/** Polling timeout when server is busy. */ +const pollingTimeout = 200; +let pollingTimer: NodeJS.Timeout | undefined; + /** Killing timeout and timer for server process hard kill. */ -const killingTimeout = 300; +const killingTimeout = 500; let killingTimer: NodeJS.Timeout | undefined; -/** ZMQ (REQ) socket. */ -let zmqSocket: ZmqRequest | undefined; -/** Flag on whether ZMQ socket is busy. */ -let zmqIsBusy = false; - // -------------------------------------------------------------------------- // --- Server Console // -------------------------------------------------------------------------- @@ -205,14 +156,14 @@ export function useStatus(): Status { * Whether the server is running and ready to handle requests. * @return {boolean} Whether server stage is [[ON]]. */ -export function isRunning(): boolean { return status.stage === Stage.ON; } +export function isRunning(): boolean { return status === Status.ON; } /** * Number of requests still pending. * @return {number} Pending requests. */ export function getPending(): number { - return _.reduce(pending, (n) => n + 1, 0); + return pending.size; } /** @@ -232,16 +183,12 @@ export function onShutdown(callback: () => void) { SHUTDOWN.on(callback); } // -------------------------------------------------------------------------- function _status(newStatus: Status) { - if (Dome.DEVEL && hasErrorStatus(newStatus)) { - D.error(newStatus.error); - } - if (newStatus !== status) { const oldStatus = status; status = newStatus; STATUS.emit(newStatus); - if (oldStatus.stage === Stage.ON) SHUTDOWN.emit(); - if (newStatus.stage === Stage.ON) READY.emit(); + if (oldStatus === Status.ON) SHUTDOWN.emit(); + if (newStatus === Status.ON) READY.emit(); } } @@ -257,22 +204,20 @@ function _status(newStatus: Status) { * - Otherwise, the Frama-C server is spawned. */ export async function start() { - switch (status.stage) { - case Stage.OFF: - case Stage.FAILURE: - case Stage.RESTARTING: - _status(okStatus(Stage.STARTING)); + switch (status) { + case Status.OFF: + case Status.FAILURE: + case Status.RESTARTING: + _status(Status.STARTING); try { await _launch(); - _status(okStatus(Stage.ON)); } catch (error) { - D.error(error.toString()); - buffer.append(error.toString(), '\n'); - _exit(error); + buffer.log('[frama-c]', error); + _exit(false); } return; - case Stage.HALTING: - _status(okStatus(Stage.RESTARTING)); + case Status.HALTING: + _status(Status.RESTARTING); return; default: return; @@ -288,22 +233,18 @@ export async function start() { * * - If the server is starting, it is hard killed. * - If the server is running, it is shutdown gracefully. - * - If the server is restarting, restart is canceled. * - Otherwise, this is a no-op. */ export function stop() { - switch (status.stage) { - case Stage.STARTING: - _status(okStatus(Stage.HALTING)); + switch (status) { + case Status.STARTING: + _status(Status.HALTING); _kill(); return; - case Stage.ON: - _status(okStatus(Stage.HALTING)); + case Status.ON: + _status(Status.HALTING); _shutdown(); return; - case Stage.RESTARTING: - _status(okStatus(Stage.HALTING)); - return; default: return; } @@ -321,12 +262,12 @@ export function stop() { * - Otherwise, this is a no-op. */ export function kill() { - switch (status.stage) { - case Stage.STARTING: - case Stage.ON: - case Stage.HALTING: - case Stage.RESTARTING: - _status(okStatus(Stage.HALTING)); + switch (status) { + case Status.STARTING: + case Status.ON: + case Status.HALTING: + case Status.RESTARTING: + _status(Status.HALTING); _kill(); return; default: @@ -347,17 +288,17 @@ export function kill() { * - Otherwise, this is a no-op. */ export function restart() { - switch (status.stage) { - case Stage.OFF: - case Stage.FAILURE: + switch (status) { + case Status.OFF: + case Status.FAILURE: start(); return; - case Stage.ON: - _status(okStatus(Stage.RESTARTING)); + case Status.ON: + _status(Status.RESTARTING); _shutdown(); return; - case Stage.HALTING: - _status(okStatus(Stage.RESTARTING)); + case Status.HALTING: + _status(Status.RESTARTING); return; default: return; @@ -376,11 +317,12 @@ export function restart() { * - Otherwise, this is a no-op. */ export function clear() { - switch (status.stage) { - case Stage.FAILURE: - case Stage.OFF: + switch (status) { + case Status.FAILURE: + case Status.OFF: buffer.clear(); - _status(okStatus(Stage.OFF)); + _clear(); + _status(Status.OFF); return; default: return; @@ -406,7 +348,7 @@ export interface Configuration { /** Shutdown timeout before server is hard killed, in milliseconds * (default: 300ms). */ timeout?: number; - /** Server polling period in milliseconds (default: 50ms). */ + /** Server polling period in milliseconds (default: 200ms). */ polling?: number; /** Process stdout log file (default: `undefined`). */ logout?: string; @@ -450,7 +392,7 @@ async function _launch() { buffer.clear(); buffer.append('$', command); - const size = params.reduce((n: any, p: any) => n + p.length, 0); + const size = params.reduce((n, p) => n + p.length, 0); if (size < 40) { buffer.append('', ...params); } else { @@ -466,16 +408,14 @@ async function _launch() { buffer.append('\n'); if (!sockaddr) { - const tmp = System.getTempDir(); - const pid = System.getPID(); - const socketfile = System.join(tmp, `ivette.frama-c.${pid}.io`); - System.atExit(() => System.remove(socketfile)); - sockaddr = `ipc://${socketfile}`; + const tmp = Dome.getTempDir(); + const pid = Dome.getPID(); + sockaddr = System.join(tmp, `ivette.frama-c.${pid}.io`); } if (!cwd) cwd = System.getWorkingDir(); logout = logout && System.join(cwd, logout); logerr = logerr && System.join(cwd, logerr); - params = ['-server-zmq', sockaddr, '-then'].concat(params); + params = client.commandLine(sockaddr, params); const options = { cwd, stdout: { path: logout, pipe: true }, @@ -493,47 +433,33 @@ async function _launch() { process?.stdout?.on('data', logger); process?.stderr?.on('data', logger); process?.on('exit', (code: number | null, signal: string | null) => { - D.log('Process exited'); - if (signal) { // [signal] is non-null. - buffer.log('Signal:', signal); - const error = new Error(`Process terminated by the signal ${signal}`); - _exit(error); + buffer.log('[frama-c]', signal); + _exit(false); return; } // [signal] is null, hence [code] is non-null (cf. NodeJS doc). if (code) { - buffer.log('Exit:', code); - const error = new Error(`Process exited with code ${code}`); - _exit(error); + buffer.log('[frama-c] exit', code); + _exit(false); } else { // [code] is zero: normal exit w/o error. - _exit(); + _exit(true); } }); // Connect to Server - zmqSocket = new ZmqRequest(); - zmqIsBusy = false; - zmqSocket.connect(sockaddr); + client.connect(sockaddr); } // -------------------------------------------------------------------------- // --- Low-level Killing // -------------------------------------------------------------------------- -function _reset() { - D.log('Reset to initial configuration'); - +function _clear() { rqCount = 0; - queueCmd = []; - queueId = []; - _.forEach(pending, ([, reject]) => reject(new Error('Server reset'))); - pending = {}; - if (flushingTimer) { - clearImmediate(flushingTimer); - flushingTimer = undefined; - } + pending.forEach((p: PendingRequest) => p.reject()); + pending.clear(); if (pollingTimer) { clearTimeout(pollingTimer); pollingTimer = undefined; @@ -545,20 +471,13 @@ function _reset() { } function _kill() { - D.log('Hard kill'); - - _reset(); - if (process) { - process.kill(); - } + client.disconnect(); + if (process) process.kill(); } async function _shutdown() { - D.log('Shutdown'); - - _reset(); - queueCmd.push('SHUTDOWN'); - _flush(); + _clear(); + client.shutdown(); const killingPromise = new Promise((resolve) => { if (!killingTimer) { if (process) { @@ -573,21 +492,14 @@ async function _shutdown() { await killingPromise; } -function _exit(error?: Error) { - _reset(); - if (zmqSocket) { - zmqSocket.close(); - zmqSocket = undefined; - } - zmqIsBusy = false; +function _exit(error: boolean) { + _clear(); + client.disconnect(); process = undefined; - if (status.stage === Stage.RESTARTING) { + if (status === Status.RESTARTING) { setImmediate(start); - } else if (error) { - _status(errorStatus(error.toString())); - } else { - _status(okStatus(Stage.OFF)); } + _status(error ? Status.FAILURE : Status.OFF); } // -------------------------------------------------------------------------- @@ -595,18 +507,19 @@ function _exit(error?: Error) { // -------------------------------------------------------------------------- class SignalHandler { - id: any; + id: string; event: Dome.Event; active: boolean; listen: boolean; + handler: _.DebouncedFunc<() => void>; - constructor(id: any) { + constructor(id: string) { this.id = id; this.event = new SIGNAL(id); this.active = false; this.listen = false; this.sigon = this.sigon.bind(this); - this.sigoff = _.debounce(this.sigoff.bind(this), 1000); + this.sigoff = this.handler = debounce(this.sigoff.bind(this), 1000); this.unplug = this.unplug.bind(this); } @@ -635,8 +548,7 @@ class SignalHandler { sigon() { if (this.active && !this.listen) { this.listen = true; - queueCmd.push('SIGON', this.id); - _flush(); + client.sigOn(this.id); } } @@ -645,14 +557,18 @@ class SignalHandler { if (!this.active && this.listen) { if (isRunning()) { this.listen = false; - queueCmd.push('SIGOFF', this.id); - _flush(); + client.sigOff(this.id); } } } + emit() { + this.event.emit(); + } + unplug() { this.listen = false; + this.handler.cancel(); } } @@ -660,7 +576,7 @@ class SignalHandler { const signals: Map<string, SignalHandler> = new Map(); -function _signal(id: any) { +function _signal(id: string): SignalHandler { let s = signals.get(id); if (!s) { s = new SignalHandler(id); @@ -679,7 +595,7 @@ function _signal(id: any) { * @param {string} id The signal identifier to listen to. * @param {function} callback The callback to call upon signal. */ -export function onSignal(s: Signal, callback: any) { +export function onSignal(s: Signal, callback: () => void) { _signal(s.name).on(callback); } @@ -691,7 +607,7 @@ export function onSignal(s: Signal, callback: any) { * @param {string} id The signal identifier that was listen to. * @param {function} callback The callback to remove. */ -export function offSignal(s: Signal, callback: any) { +export function offSignal(s: Signal, callback: () => void) { _signal(s.name).off(callback); } @@ -700,7 +616,7 @@ export function offSignal(s: Signal, callback: any) { * @param {string} id The signal identifier to listen to. * @param {function} callback The callback to call upon signal. */ -export function useSignal(s: Signal, callback: any) { +export function useSignal(s: Signal, callback: () => void) { React.useEffect(() => { onSignal(s, callback); return () => { offSignal(s, callback); }; @@ -718,7 +634,6 @@ READY.on(() => { SHUTDOWN.on(() => { signals.forEach((h: SignalHandler) => { h.unplug(); - (h.sigoff as unknown as _.Cancelable).cancel(); }); }); @@ -733,7 +648,7 @@ export enum RqKind { /** Used to write data into the Frama-C server. */ SET = 'SET', /** Used to make the Frama-C server execute a task. */ - EXEC = 'EXEC' + EXEC = 'EXEC', } /** Server signal. */ @@ -758,7 +673,7 @@ export type GetRequest<In, Out> = Request<RqKind.GET, In, Out>; export type SetRequest<In, Out> = Request<RqKind.SET, In, Out>; export type ExecRequest<In, Out> = Request<RqKind.EXEC, In, Out>; -export interface Killable<Data> extends Promise<Data> { +export interface Response<Data> extends Promise<Data> { kill?: () => void; } @@ -771,153 +686,86 @@ export interface Killable<Data> extends Promise<Data> { export function send<In, Out>( request: Request<RqKind, In, Out>, param: In, -): Killable<Out> { - if (!isRunning()) return Promise.reject(new Error('Server not running')); - if (!request.name) return Promise.reject(new Error('Undefined request')); +): Response<Out> { + if (!isRunning()) return Promise.reject('Server not running'); + if (!request.name) return Promise.reject('Undefined request'); const rid = `RQ.${rqCount}`; rqCount += 1; - const data = JSON.stringify(param); - const promise: Killable<Out> = new Promise<Out>((resolve, reject) => { - const decodedResolve = (js: Json.json) => { - const result = Json.jTry(request.output)(js); - resolve(result); + const response: Response<Out> = new Promise<Out>((resolve, reject) => { + const unwrap = (js: Json.json) => { + const data = request.output(js); + resolve(data as unknown as Out); }; - pending[rid] = [decodedResolve, reject]; + pending.set(rid, { resolve: unwrap, reject }); }); - promise.kill = () => { - if (zmqSocket && pending[rid]) { - queueCmd.push('KILL', rid); - _flush(); - } - }; - queueCmd.push(request.kind, rid, request.name, data); - queueId.push(rid); - _flush(); - return promise; -} - -function _resolve(id: string | number, data: string) { - const [resolve] = pending[id]; - if (resolve) { - delete pending[id]; - resolve(JSON.parse(data)); - } -} - -function _reject(id: string | number, error: Error) { - const [, reject] = pending[id]; - if (reject) { - delete pending[id]; - reject(error); + response.kill = () => pending.get(rid)?.reject(); + client.send(request.kind, rid, request.name, param); + if (!pollingTimer) { + const polling = (config && config.polling) || pollingTimeout; + pollingTimer = setInterval(() => { + client.poll(); + }, polling); } -} - -function _cancel(ids: any[]) { - ids.forEach((rid) => _reject(rid, new Error('Canceled request'))); -} - -function _waiting() { - return _.find(pending, () => true) !== undefined; + return response; } // -------------------------------------------------------------------------- -// --- Server Command Queue +// --- Client Events // -------------------------------------------------------------------------- -function _flush() { - if (!flushingTimer) { - flushingTimer = setImmediate(() => { - flushingTimer = undefined; - _send(); - }); +function _resolved(id: string) { + pending.delete(id); + if (pending.size == 0) { + rqCount = 0; + if (pollingTimer) { + clearInterval(pollingTimer); + pollingTimer = undefined; + } } } -function _poll() { - if (!pollingTimer) { - const delay = (config && config.polling) || pollingTimeout; - pollingTimer = setTimeout(() => { - pollingTimer = undefined; - _send(); - }, delay); +client.onConnect((err?: Error) => { + if (err) { + _status(Status.FAILURE); + } else { + _status(Status.ON); } -} +}); -async function _send() { - // when busy, will be eventually re-triggered - if (!zmqIsBusy) { - const cmds = queueCmd; - if (!cmds.length) { - cmds.push('POLL'); - if (!_waiting()) - rqCount = 0; // No pending command nor pending response - } - zmqIsBusy = true; - const ids = queueId; - queueCmd = []; - queueId = []; - try { - await zmqSocket?.send(cmds); - const resp = await zmqSocket?.receive(); - _receive(resp); - } catch (error) { - D.error(`Error in send/receive on ZMQ socket. ${error.toString()}`); - _cancel(ids); - } - zmqIsBusy = false; - STATUS.emit(status); +client.onData((id: string, data: Json.json) => { + const p = pending.get(id); + if (p) { + p.resolve(data); + _resolved(id); } -} +}); -function _receive(resp: any) { - try { - let rid; - let data; - let err; - let cmd; - const shift = () => resp.shift().toString(); - let unknownResponse = false; - while (resp.length && !unknownResponse) { - cmd = shift(); - switch (cmd) { - case 'NONE': - break; - case 'DATA': - rid = shift(); - data = shift(); - _resolve(rid, data); - break; - case 'KILLED': - rid = shift(); - _reject(rid, new Error('Killed')); - break; - case 'ERROR': - rid = shift(); - err = shift(); - _reject(rid, err); - break; - case 'REJECTED': - rid = shift(); - _reject(rid, new Error('Rejected')); - break; - case 'SIGNAL': - rid = shift(); - (new SIGNAL(rid)).emit(); - break; - case 'WRONG': - err = shift(); - D.error(`ZMQ Protocol Error: ${err}`); - break; - default: - D.error(`Unknown Response: ${cmd}`); - unknownResponse = true; - break; - } - } - } finally { - if (queueCmd.length) _flush(); - else _poll(); +client.onKilled((id: string) => { + const p = pending.get(id); + if (p) { + p.reject(); + _resolved(id); } -} +}); + +client.onRejected((id: string) => { + const p = pending.get(id); + if (p) { + p.reject('rejected'); + _resolved(id); + } +}); + +client.onError((id: string, msg: string) => { + const p = pending.get(id); + if (p) { + p.reject(msg); + _resolved(id); + } +}); + +client.onSignal((id: string) => { + _signal(id).emit(); +}); // -------------------------------------------------------------------------- diff --git a/ivette/src/frama-c/states.ts b/ivette/src/frama-c/states.ts index e5d85c61c9a872f66c4e094b36df3e3b119dc4e3..cedb61d60b8b3e82c102e2c4914ebb8ef897fe68 100644 --- a/ivette/src/frama-c/states.ts +++ b/ivette/src/frama-c/states.ts @@ -72,7 +72,7 @@ Server.onReady(async () => { currentProject = current.id; PROJECT.emit(); } catch (error) { - D.error(`Fail to retrieve the current project. ${error.toString()}`); + D.error(`Fail to retrieve the current project. ${error}`); } }); @@ -116,7 +116,7 @@ export async function setProject(project: string) { currentProject = project; PROJECT.emit(); } catch (error) { - D.error(`Fail to set the current project. ${error.toString()}`); + D.error(`Fail to set the current project. ${error}`); } } } @@ -171,7 +171,7 @@ export function useRequest<In, Out>( const r = await Server.send(rq, params); update(r); } catch (error) { - D.error(`Fail in useRequest '${rq.name}'. ${error.toString()}`); + D.error(`Fail in useRequest '${rq.name}'. ${error}`); update(options.onError); } } else { @@ -300,7 +300,7 @@ class SyncState<A> { } catch (error) { D.error( `Fail to set value of SyncState '${this.handler.name}'.`, - `${error.toString()}`, + `${error}`, ); } } @@ -308,13 +308,16 @@ class SyncState<A> { async update() { try { this.upToDate = true; - const v = await Server.send(this.handler.getter, null); - this.value = v; + this.value = undefined; + if (Server.isRunning()) { + const v = await Server.send(this.handler.getter, null); + this.value = v; + } this.UPDATE.emit(); } catch (error) { D.error( `Fail to update SyncState '${this.handler.name}'.`, - `${error.toString()}`, + `${error}`, ); } } @@ -407,7 +410,7 @@ class SyncArray<K, A> { } catch (error) { D.error( `Fail to retrieve the value of syncArray '${this.handler.name}.`, - `${error.toString()}`, + `${error}`, ); } finally { this.fetching = false; @@ -426,7 +429,7 @@ class SyncArray<K, A> { } catch (error) { D.error( `Fail to set reload of syncArray '${this.handler.name}'.`, - `${error.toString()}`, + `${error}`, ); } } @@ -477,7 +480,7 @@ export function useSyncArray<K, A>( ): CompactModel<K, A> { Dome.useUpdate(PROJECT); const st = lookupSyncArray(arr); - React.useEffect(st.update); + React.useEffect(() => st.update(), [st]); Server.useSignal(arr.signal, st.fetch); useModel(st.model, sync); return st.model; @@ -761,6 +764,7 @@ const emptySelection = { export const MetaSelection = new Dome.Event<Location>('frama-c-meta-selection'); export const GlobalSelection = new GlobalState<Selection>(emptySelection); + Server.onShutdown(() => GlobalSelection.setValue(emptySelection)); export function setSelection(location: Location, meta = false) { @@ -778,12 +782,19 @@ export function useSelection(): [Selection, (a: SelectionActions) => void] { /** Resets the selected locations. */ export async function resetSelection() { GlobalSelection.setValue(emptySelection); - const main = await Server.send(Ast.getMainFunction, { }); - // If the selection has already been modified, do not change it. - if (main && GlobalSelection.getValue() === emptySelection) { - GlobalSelection.setValue({ ...emptySelection, current: { fct: main } }); + if (Server.isRunning()) { + try { + const main = await Server.send(Ast.getMainFunction, {}); + // If the selection has already been modified, do not change it. + if (main && GlobalSelection.getValue() === emptySelection) { + GlobalSelection.setValue({ ...emptySelection, current: { fct: main } }); + } + } catch (err) { + if (err) D.warn('Request error', err); + } } } + /* Select the main function when the current project changes and the selection is still empty (which happens at the start of the GUI). */ PROJECT.on(async () => { diff --git a/ivette/src/renderer/Controller.tsx b/ivette/src/renderer/Controller.tsx index 2fe67b5ed3bde2396c166a9151f753d38cb69682..5c98b76014256856cdc287efc7cbf694bda9c835 100644 --- a/ivette/src/renderer/Controller.tsx +++ b/ivette/src/renderer/Controller.tsx @@ -30,7 +30,8 @@ import * as Json from 'dome/data/json'; import * as Settings from 'dome/data/settings'; import * as Toolbars from 'dome/frame/toolbars'; -import { LED, LEDstatus, IconButton } from 'dome/controls/buttons'; +import { IconButton } from 'dome/controls/buttons'; +import { LED, LEDstatus } from 'dome/controls/displays'; import { Label, Code } from 'dome/controls/labels'; import { RichTextBuffer } from 'dome/text/buffers'; import { Text } from 'dome/text/editors'; @@ -149,12 +150,12 @@ export const Control = () => { let stop = { enabled: false, onClick: () => { } }; let reload = { enabled: false, onClick: () => { } }; - switch (status.stage) { - case Server.Stage.OFF: - case Server.Stage.FAILURE: + switch (status) { + case Server.Status.OFF: play = { enabled: true, onClick: Server.start }; break; - case Server.Stage.ON: + case Server.Status.ON: + case Server.Status.FAILURE: stop = { enabled: true, onClick: Server.stop }; reload = { enabled: true, onClick: Server.restart }; break; @@ -357,44 +358,45 @@ Ivette.registerView({ export const Status = () => { const status = Server.useStatus(); const pending = Server.getPending(); - let led: LEDstatus; - let blink; - let error; - - if (Server.hasErrorStatus(status)) { - led = 'negative'; - blink = false; - error = status.error; - } else { - switch (status.stage) { - case Server.Stage.OFF: - led = 'inactive'; - break; - case Server.Stage.STARTING: - led = 'active'; - blink = true; - break; - case Server.Stage.ON: - led = pending > 0 ? 'positive' : 'active'; - break; - case Server.Stage.HALTING: - led = 'negative'; - blink = true; - break; - case Server.Stage.RESTARTING: - led = 'warning'; - blink = true; - break; - default: - break; - } + let led: LEDstatus = 'inactive'; + let icon = undefined; + let running = false; + let blink = false; + + switch (status) { + case Server.Status.OFF: + break; + case Server.Status.STARTING: + led = 'active'; + blink = true; + running = true; + break; + case Server.Status.ON: + led = pending > 0 ? 'positive' : 'active'; + running = true; + break; + case Server.Status.HALTING: + led = 'negative'; + blink = true; + running = true; + break; + case Server.Status.RESTARTING: + led = 'warning'; + blink = true; + running = true; + break; + case Server.Status.FAILURE: + led = 'negative'; + blink = true; + running = false; + icon = 'WARNING'; + break; } return ( <> <LED status={led} blink={blink} /> - <Code label={status.stage} /> - {error && <Label icon="WARNING" label={error} />} + <Code icon={icon} label={running ? 'ON' : 'OFF'} /> <Toolbars.Separator /> </> ); diff --git a/ivette/src/renderer/Laboratory.tsx b/ivette/src/renderer/Laboratory.tsx index 3a41a613e3f2c0a661fcb76ce68272f63e3c1edb..cf3ce8cd5cec0db6eaa8f41ec5351746a210673c 100644 --- a/ivette/src/renderer/Laboratory.tsx +++ b/ivette/src/renderer/Laboratory.tsx @@ -51,8 +51,8 @@ const UPDATE = new Dome.Event('labview.library'); class Library { modified: boolean; - virtual: {}; - collection: {}; + virtual: any; + collection: any; items: any[]; constructor() { diff --git a/ivette/src/renderer/style.css b/ivette/src/renderer/style.css index c210426cfccbb0b7b70c7e638c4a6bc3077225a9..fa02656e5992d03b039c13ea4f5eb9cd74e8677c 100644 --- a/ivette/src/renderer/style.css +++ b/ivette/src/renderer/style.css @@ -65,3 +65,5 @@ .dome-window-active .labview-icon { fill: #7d7d7d ; } + +/* -------------------------------------------------------------------------- */ diff --git a/ivette/tsconfig.json b/ivette/tsconfig.json index 143f87202b1e26dd1891190fabceeffc018ab922..5674a51edb47c9a247465452802fe6ebbc8c1350 100644 --- a/ivette/tsconfig.json +++ b/ivette/tsconfig.json @@ -4,6 +4,7 @@ // "incremental": true, /* Enable incremental compilation */ "target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ "module": "esnext", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + "skipLibCheck": true, // "lib": [], /* Specify library files to be included in the compilation. */ "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ @@ -89,30 +90,16 @@ ], "typedocOptions": { "name": "Ivette Documentation", - "mode": "modules", "out": "doc/html", "includeVersion": true, "disableSources": true, "excludePrivate": true, - "excludeNotExported": true, "excludeExternals": true, "categorizeByGroup": false, "categoryOrder": [ "Hooks", "Components", "*", "Other" ], - "stripInternal": true, - "listInvalidSymbolLinks":true, "hideGenerator":true, - "readme": "./README.md", - "inputFiles": [ - "doc/pages", - "src/ivette/index.tsx", - "src/ivette/prefs.tsx", - "src/frama-c/server.ts", - "src/frama-c/states.ts", - "src/frama-c/utils.ts", - "src/frama-c/api/generated", - "src/dome/renderer", - "src/dome/misc/utils.ts", - "src/dome/misc/system.ts", - ] + "includes": "src/dome/doc/guides", + "customCss": "src/dome/doc/gallery.css", + "readme": "none" } } diff --git a/ivette/webpack.main.js b/ivette/webpack.main.js index ff2ce5b7c4ad21a2d0a414069e7b8a64d5bdde74..e520ae28539e6b44c19823ad8c4b8bca5a19d8ec 100644 --- a/ivette/webpack.main.js +++ b/ivette/webpack.main.js @@ -63,6 +63,11 @@ module.exports = { 'dome/system$': path.resolve( DOME , 'misc/system.ts' ), 'dome/devtools': domeDevtools() } + }, + devServer: { + watchOptions: { + ignored: '**/.#' + } } } ; diff --git a/ivette/webpack.renderer.js b/ivette/webpack.renderer.js index b88b48a4308b5b03bd7b640e5274809a7dee3e93..db9cfd99d2d335c204099b6864ae681ecb17b98f 100644 --- a/ivette/webpack.renderer.js +++ b/ivette/webpack.renderer.js @@ -60,6 +60,11 @@ module.exports = { 'dome': path.resolve( DOME , 'renderer' ), 'react-dom': '@hot-loader/react-dom' } + }, + devServer: { + watchOptions: { + ignored: '**/.#*' + } } } ; diff --git a/ivette/yarn.lock b/ivette/yarn.lock index d1b9cd89c54e0e40fff49ff63ea303bc37d47555..cf9d9194ab96324c64e326719d726c7346dcf010 100644 --- a/ivette/yarn.lock +++ b/ivette/yarn.lock @@ -2,190 +2,169 @@ # yarn lockfile v1 -"7zip-bin@~5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.0.3.tgz#bc5b5532ecafd923a61f2fb097e3b108c0106a3f" - integrity sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA== +"7zip-bin@~5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" + integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== "7zip@0.0.6": version "0.0.6" resolved "https://registry.yarnpkg.com/7zip/-/7zip-0.0.6.tgz#9cafb171af82329490353b4816f03347aa150a30" integrity sha1-nK+xca+CMpSQNTtIFvAzR6oVCjA= -"@babel/cli@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.8.4.tgz#505fb053721a98777b2b175323ea4f090b7d3c1c" - integrity sha512-XXLgAm6LBbaNxaGhMAznXXaxtCWfuv6PIDJ9Alsy9JYTOh+j2jJz+L/162kkfU1j/pTSxK1xGmlwI4pdIMkoag== +"@babel/cli@": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.16.0.tgz#a729b7a48eb80b49f48a339529fc4129fd7bcef3" + integrity sha512-WLrM42vKX/4atIoQB+eb0ovUof53UUvecb4qGjU2PDDWRiZr50ZpiV8NpcLo7iSxeGYrRG0Mqembsa+UrTAV6Q== dependencies: commander "^4.0.1" convert-source-map "^1.1.0" fs-readdir-recursive "^1.1.0" glob "^7.0.0" - lodash "^4.17.13" make-dir "^2.1.0" slash "^2.0.0" source-map "^0.5.0" optionalDependencies: - chokidar "^2.1.8" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" - integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== - dependencies: - browserslist "^4.9.1" - invariant "^2.2.4" - semver "^5.5.0" - -"@babel/core@^7", "@babel/core@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" + "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" + chokidar "^3.4.0" + +"@babel/code-frame@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" + integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== + dependencies: + "@babel/highlight" "^7.16.0" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== + +"@babel/core@^7.16.0", "@babel/core@^7.9.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" + integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helpers" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" + gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" + semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" - integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA== +"@babel/generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" + integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== dependencies: - "@babel/types" "^7.9.0" + "@babel/types" "^7.16.0" jsesc "^2.5.1" - lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" - integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" + integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.16.0" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" - integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-builder-react-jsx-experimental@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43" - integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-module-imports" "^7.8.3" - "@babel/types" "^7.9.0" - -"@babel/helper-builder-react-jsx@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" - integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/types" "^7.9.0" - -"@babel/helper-compilation-targets@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" - integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== - dependencies: - "@babel/compat-data" "^7.8.6" - browserslist "^4.9.1" - invariant "^2.2.4" - levenary "^1.1.1" - semver "^5.5.0" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" + integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/helper-create-class-features-plugin@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" - integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" + integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/compat-data" "^7.16.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.17.5" + semver "^6.3.0" -"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" - integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== +"@babel/helper-create-class-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" + integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-regex" "^7.8.3" - regexpu-core "^4.7.0" + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" -"@babel/helper-define-map@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" - integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== +"@babel/helper-create-regexp-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" + integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/types" "^7.8.3" - lodash "^4.17.13" + "@babel/helper-annotate-as-pure" "^7.16.0" + regexpu-core "^4.7.1" -"@babel/helper-explode-assignable-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" - integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== +"@babel/helper-define-polyfill-provider@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" + integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-explode-assignable-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" + integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== dependencies: - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.16.0" -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== +"@babel/helper-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" + integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== +"@babel/helper-get-function-arity@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" + integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.16.0" -"@babel/helper-hoist-variables@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" - integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== +"@babel/helper-hoist-variables@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" + integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.16.0" -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== +"@babel/helper-member-expression-to-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" + integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.16.0" "@babel/helper-module-imports@7.0.0-beta.35": version "7.0.0-beta.35" @@ -195,652 +174,764 @@ "@babel/types" "7.0.0-beta.35" lodash "^4.2.0" -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - -"@babel/helper-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" - integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== - dependencies: - lodash "^4.17.13" - -"@babel/helper-remap-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" - integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-wrap-function" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" - integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== - -"@babel/helper-wrap-function@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" - integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helpers@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" - integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-transforms@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" + integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-optimise-call-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" + integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz#5d7902f61349ff6b963e07f06a389ce139fbfe6e" + integrity sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-wrap-function" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-replace-supers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" + integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-simple-access@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" + integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" + integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" + integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helpers@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" + integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== + dependencies: + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.3" + "@babel/types" "^7.16.0" + +"@babel/highlight@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.4.4", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" - integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== +"@babel/parser@^7.16.0", "@babel/parser@^7.16.3", "@babel/parser@^7.9.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" + integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== -"@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" - integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2": + version "7.16.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183" + integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-class-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" - integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2" + integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" -"@babel/plugin-proposal-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" - integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== +"@babel/plugin-proposal-async-generator-functions@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz#e606eb6015fec6fa5978c940f315eae4e300b081" + integrity sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.4" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" - integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== +"@babel/plugin-proposal-class-properties@", "@babel/plugin-proposal-class-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" + integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" - integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== +"@babel/plugin-proposal-class-static-block@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz#5296942c564d8144c83eea347d0aa8a0b89170e7" + integrity sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - -"@babel/plugin-proposal-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" - integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-proposal-object-rest-spread@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" - integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== +"@babel/plugin-proposal-dynamic-import@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" + integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" - integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - -"@babel/plugin-proposal-optional-chaining@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" - integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" - integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.8" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-syntax-async-generators@^7.8.0": +"@babel/plugin-proposal-export-namespace-from@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" + integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" + integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" + integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" + integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" + integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" + integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" + integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" + integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" + integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz#69e935b2c5c79d2488112d886f0c4e2790fee76f" + integrity sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" + integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-json-strings@^7.8.0": +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" - integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== +"@babel/plugin-syntax-jsx@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1" + integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.0": +"@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.8.0": +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.0": +"@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" - integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc" - integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg== +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" - integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== +"@babel/plugin-syntax-typescript@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz#2feeb13d9334cc582ea9111d3506f773174179bb" + integrity sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" - integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== +"@babel/plugin-transform-arrow-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" + integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoped-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" - integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== +"@babel/plugin-transform-async-to-generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" + integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.0" -"@babel/plugin-transform-block-scoping@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" - integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== +"@babel/plugin-transform-block-scoped-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" + integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - lodash "^4.17.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-classes@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" - integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== +"@babel/plugin-transform-block-scoping@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" + integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" - globals "^11.1.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-computed-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" - integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== +"@babel/plugin-transform-classes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" + integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + globals "^11.1.0" -"@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" - integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== +"@babel/plugin-transform-computed-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" + integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" - integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== +"@babel/plugin-transform-destructuring@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" + integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-duplicate-keys@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" - integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== +"@babel/plugin-transform-dotall-regex@^7.16.0", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" + integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-exponentiation-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" - integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== +"@babel/plugin-transform-duplicate-keys@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" + integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-for-of@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" - integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== +"@babel/plugin-transform-exponentiation-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" + integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" - integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== +"@babel/plugin-transform-for-of@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" + integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" - integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== +"@babel/plugin-transform-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" + integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-member-expression-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" - integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== +"@babel/plugin-transform-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" + integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-modules-amd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" - integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== +"@babel/plugin-transform-member-expression-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" + integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-modules-commonjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" - integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== +"@babel/plugin-transform-modules-amd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" + integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" - integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== +"@babel/plugin-transform-modules-commonjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" + integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.16.0" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" - integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== +"@babel/plugin-transform-modules-systemjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" + integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.15.7" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== +"@babel/plugin-transform-modules-umd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" + integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-new-target@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" - integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" + integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.16.0" -"@babel/plugin-transform-object-super@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" - integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== +"@babel/plugin-transform-new-target@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" + integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-parameters@^7.8.7": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a" - integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg== +"@babel/plugin-transform-object-super@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" + integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" -"@babel/plugin-transform-property-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" - integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== +"@babel/plugin-transform-parameters@^7.16.0", "@babel/plugin-transform-parameters@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz#fa9e4c874ee5223f891ee6fa8d737f4766d31d15" + integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-display-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" - integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== +"@babel/plugin-transform-property-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" + integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-jsx-development@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754" - integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw== +"@babel/plugin-transform-react-display-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz#9a0ad8aa8e8790883a7bd2736f66229a58125676" + integrity sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg== dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-jsx-self@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" - integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== +"@babel/plugin-transform-react-jsx-development@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz#1cb52874678d23ab11d0d16488d54730807303ef" + integrity sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.16.0" -"@babel/plugin-transform-react-jsx-source@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" - integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== +"@babel/plugin-transform-react-jsx@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz#55b797d4960c3de04e07ad1c0476e2bc6a4889f1" + integrity sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/plugin-transform-react-jsx@^7.9.4": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f" - integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw== +"@babel/plugin-transform-react-pure-annotations@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz#23db6ddf558d8abde41b8ad9d59f48ad5532ccab" + integrity sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA== dependencies: - "@babel/helper-builder-react-jsx" "^7.9.0" - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-regenerator@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" - integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== +"@babel/plugin-transform-regenerator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" + integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" - integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-runtime@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" - integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - resolve "^1.8.1" - semver "^5.5.1" - -"@babel/plugin-transform-shorthand-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" - integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" - integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-sticky-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" - integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-regex" "^7.8.3" - -"@babel/plugin-transform-template-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" - integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-typeof-symbol@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" - integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-typescript@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz#4bb4dde4f10bbf2d787fce9707fb09b483e33359" - integrity sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w== +"@babel/plugin-transform-reserved-words@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" + integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-typescript" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" - integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== +"@babel/plugin-transform-runtime@": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz#f9ba3c7034d429c581e1bd41b4952f3db3c2c7e8" + integrity sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" -"@babel/preset-env@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" - integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== - dependencies: - "@babel/compat-data" "^7.9.0" - "@babel/helper-compilation-targets" "^7.8.7" - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-proposal-async-generator-functions" "^7.8.3" - "@babel/plugin-proposal-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-json-strings" "^7.8.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-numeric-separator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.9.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.9.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.8.0" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.8.3" - "@babel/plugin-transform-async-to-generator" "^7.8.3" - "@babel/plugin-transform-block-scoped-functions" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.9.0" - "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" - "@babel/plugin-transform-dotall-regex" "^7.8.3" - "@babel/plugin-transform-duplicate-keys" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.9.0" - "@babel/plugin-transform-function-name" "^7.8.3" - "@babel/plugin-transform-literals" "^7.8.3" - "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.9.0" - "@babel/plugin-transform-modules-commonjs" "^7.9.0" - "@babel/plugin-transform-modules-systemjs" "^7.9.0" - "@babel/plugin-transform-modules-umd" "^7.9.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.8.3" - "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.7" - "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.7" - "@babel/plugin-transform-reserved-words" "^7.8.3" - "@babel/plugin-transform-shorthand-properties" "^7.8.3" - "@babel/plugin-transform-spread" "^7.8.3" - "@babel/plugin-transform-sticky-regex" "^7.8.3" - "@babel/plugin-transform-template-literals" "^7.8.3" - "@babel/plugin-transform-typeof-symbol" "^7.8.4" - "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.9.0" - browserslist "^4.9.1" - core-js-compat "^3.6.2" - invariant "^2.2.2" - levenary "^1.1.1" - semver "^5.5.0" +"@babel/plugin-transform-shorthand-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" + integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" + integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" + integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" + integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" + integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typescript@^7.16.0": + version "7.16.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz#cc0670b2822b0338355bc1b3d2246a42b8166409" + integrity sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.16.0" + +"@babel/plugin-transform-unicode-escapes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" + integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" + integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@^7.16.4", "@babel/preset-env@^7.9.0": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.4.tgz#4f6ec33b2a3fe72d6bfdcdf3859500232563a2e3" + integrity sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.3" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-async-generator-functions" "^7.16.4" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-class-static-block" "^7.16.0" + "@babel/plugin-proposal-dynamic-import" "^7.16.0" + "@babel/plugin-proposal-export-namespace-from" "^7.16.0" + "@babel/plugin-proposal-json-strings" "^7.16.0" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-object-rest-spread" "^7.16.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-proposal-private-property-in-object" "^7.16.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.0" + "@babel/plugin-transform-async-to-generator" "^7.16.0" + "@babel/plugin-transform-block-scoped-functions" "^7.16.0" + "@babel/plugin-transform-block-scoping" "^7.16.0" + "@babel/plugin-transform-classes" "^7.16.0" + "@babel/plugin-transform-computed-properties" "^7.16.0" + "@babel/plugin-transform-destructuring" "^7.16.0" + "@babel/plugin-transform-dotall-regex" "^7.16.0" + "@babel/plugin-transform-duplicate-keys" "^7.16.0" + "@babel/plugin-transform-exponentiation-operator" "^7.16.0" + "@babel/plugin-transform-for-of" "^7.16.0" + "@babel/plugin-transform-function-name" "^7.16.0" + "@babel/plugin-transform-literals" "^7.16.0" + "@babel/plugin-transform-member-expression-literals" "^7.16.0" + "@babel/plugin-transform-modules-amd" "^7.16.0" + "@babel/plugin-transform-modules-commonjs" "^7.16.0" + "@babel/plugin-transform-modules-systemjs" "^7.16.0" + "@babel/plugin-transform-modules-umd" "^7.16.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0" + "@babel/plugin-transform-new-target" "^7.16.0" + "@babel/plugin-transform-object-super" "^7.16.0" + "@babel/plugin-transform-parameters" "^7.16.3" + "@babel/plugin-transform-property-literals" "^7.16.0" + "@babel/plugin-transform-regenerator" "^7.16.0" + "@babel/plugin-transform-reserved-words" "^7.16.0" + "@babel/plugin-transform-shorthand-properties" "^7.16.0" + "@babel/plugin-transform-spread" "^7.16.0" + "@babel/plugin-transform-sticky-regex" "^7.16.0" + "@babel/plugin-transform-template-literals" "^7.16.0" + "@babel/plugin-transform-typeof-symbol" "^7.16.0" + "@babel/plugin-transform-unicode-escapes" "^7.16.0" + "@babel/plugin-transform-unicode-regex" "^7.16.0" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.0" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.19.1" + semver "^6.3.0" -"@babel/preset-modules@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" - integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -848,78 +939,65 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.9.4": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.4.tgz#c6c97693ac65b6b9c0b4f25b948a8f665463014d" - integrity sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ== +"@babel/preset-react@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.0.tgz#f71d3e8dff5218478011df037fad52660ee6d82a" + integrity sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-react-display-name" "^7.8.3" - "@babel/plugin-transform-react-jsx" "^7.9.4" - "@babel/plugin-transform-react-jsx-development" "^7.9.0" - "@babel/plugin-transform-react-jsx-self" "^7.9.0" - "@babel/plugin-transform-react-jsx-source" "^7.9.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.16.0" + "@babel/plugin-transform-react-jsx" "^7.16.0" + "@babel/plugin-transform-react-jsx-development" "^7.16.0" + "@babel/plugin-transform-react-pure-annotations" "^7.16.0" -"@babel/preset-typescript@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" - integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg== +"@babel/preset-typescript@": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz#b0b4f105b855fb3d631ec036cdc9d1ffd1fa5eac" + integrity sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-typescript" "^7.9.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.16.0" "@babel/runtime-corejs3@^7.10.2": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz#f29fc1990307c4c57b10dbd6ce667b27159d9e0d" - integrity sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw== - dependencies: - core-js-pure "^3.0.0" - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.0.0": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" - integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.10.2": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99" - integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw== + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.16.3.tgz#1e25de4fa994c57c18e5fdda6cc810dac70f5590" + integrity sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ== dependencies: + core-js-pure "^3.19.0" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" - integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== +"@babel/runtime@", "@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.16.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" + integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" - integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.0" - "@babel/types" "^7.9.0" +"@babel/template@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" + integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" + integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.3" + "@babel/types" "^7.16.0" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.13" "@babel/types@7.0.0-beta.35": version "7.0.0-beta.35" @@ -930,58 +1008,140 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" -"@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" - integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== +"@babel/types@^7.16.0", "@babel/types@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - lodash "^4.17.13" + "@babel/helper-validator-identifier" "^7.15.7" to-fast-properties "^2.0.0" -"@develar/schema-utils@~2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.1.0.tgz#eceb1695bfbed6f6bb84666d5d3abe5e1fd54e17" - integrity sha512-qjCqB4ctMig9Gz5bd6lkdFr3bO6arOdQqptdBSpF1ZpCnjofieCciEzkoS9ujY9cMGyllYSCSmBJ3x9OKHXzoA== +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" + ajv "^6.12.0" + ajv-keywords "^3.4.1" -"@electron/get@^1.0.1": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.9.0.tgz#7fa6e61d7ff50fb82a8a41f437af7de3b97aa9a5" - integrity sha512-OBIKtF6ttIJotDXe4KJMUyTBO4xMii+mFjlA8R4CORuD4HvCUaCK3lPjhdTRCvuEv6gzWNbAvd9DNBv0v780lw== +"@electron/get@^1.13.0": + version "1.13.1" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.13.1.tgz#42a0aa62fd1189638bd966e23effaebb16108368" + integrity sha512-U5vkXDZ9DwXtkPqlB45tfYnnYBN8PePp1z/XDCupnSpdrxT8/ThCv9WCwPLf9oqiSGZTkH6dx2jDUPuoXpjkcA== dependencies: debug "^4.1.1" env-paths "^2.2.0" fs-extra "^8.1.0" got "^9.6.0" progress "^2.0.3" - sanitize-filename "^1.6.2" + semver "^6.2.0" sumchecker "^3.0.1" optionalDependencies: - global-agent "^2.0.2" + global-agent "^3.0.0" global-tunnel-ng "^2.7.1" -"@fortawesome/fontawesome-free@^5.13.1": - version "5.13.1" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.13.1.tgz#c53b4066edae16cd1fd669f687baf031b45fb9d6" - integrity sha512-D819f34FLHeBN/4xvw0HR0u7U2G7RqjPSggXqf7LktsxWQ48VAfGwvMrhcVuaZV2fF069c/619RdgCCms0DHhw== +"@electron/universal@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.0.5.tgz#b812340e4ef21da2b3ee77b2b4d35c9b86defe37" + integrity sha512-zX9O6+jr2NMyAdSkwEUlyltiI4/EBLu2Ls/VD3pUQdi3cAYeYfdQnT2AJJ38HE4QxLccbU13LSpccw1IWlkyag== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + asar "^3.0.3" + debug "^4.3.1" + dir-compare "^2.4.0" + fs-extra "^9.0.1" + +"@eslint/eslintrc@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318" + integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.2.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@fortawesome/fontawesome-free@": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" + integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== -"@hot-loader/react-dom@^16.13.0": - version "16.13.0" - resolved "https://registry.yarnpkg.com/@hot-loader/react-dom/-/react-dom-16.13.0.tgz#de245b42358110baf80aaf47a0592153d4047997" - integrity sha512-lJZrmkucz2MrQJTQtJobx5MICXcfQvKihszqv655p557HPi0hMOWxrNpiHv3DWD8ugNWjtWcVWqRnFvwsHq1mQ== +"@hot-loader/react-dom@^16": + version "16.14.0" + resolved "https://registry.yarnpkg.com/@hot-loader/react-dom/-/react-dom-16.14.0.tgz#3cfc64e40bb78fa623e59b582b8f09dcdaad648a" + integrity sha512-EN9czvcLsMYmSDo5yRKZOAq3ZGRlDpad1gPtX0NdMMomJXcPE3yFSeFzE94X/NjOaiSVimB7LuqPYpkWVaIi4Q== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.19.0" + scheduler "^0.19.1" -"@posthtml/esm@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@posthtml/esm/-/esm-1.0.0.tgz#09bcb28a02438dcee22ad1970ca1d85a000ae0cf" - integrity sha512-dEVG+ITnvqKGa4v040tP+n8LOKOqr94qjLva7bE5pnfm2KHJwsKz69J4KMxgWLznbpBJzy8vQfCayEk3vLZnZQ== +"@humanwhocodes/config-array@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.2.tgz#68be55c737023009dfc5fe245d51181bb6476914" + integrity sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" + integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== + dependencies: + cross-spawn "^7.0.1" + +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + +"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": + version "2.1.8-no-fsevents.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" + integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@popperjs/core@^2.0.0", "@popperjs/core@^2.9.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.0.tgz#6734f8ebc106a0860dff7f92bf90df193f0935d7" + integrity sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ== "@sindresorhus/is@^0.14.0": version "0.14.0" @@ -995,286 +1155,291 @@ dependencies: defer-to-connect "^1.0.1" -"@types/anymatch@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" - integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== - -"@types/codemirror@^0.0.97": - version "0.0.97" - resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-0.0.97.tgz#6f2d8266b7f1b34aacfe8c77221fafe324c3d081" - integrity sha512-n5d7o9nWhC49DjfhsxANP7naWSeTzrjXASkUDQh7626sM4zK9XP2EVcHp1IcCf/IPV6c7ORzDUDF3Bkt231VKg== +"@types/codemirror@": + version "5.60.5" + resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-5.60.5.tgz#5b989a3b4bbe657458cf372c92b6bfda6061a2b7" + integrity sha512-TiECZmm8St5YxjFUp64LK0c8WU5bxMDt9YaAek1UqUb9swrSCoJhh92fWu1p3mTEqlHjhB5sY7OFBhWroJXZVg== dependencies: "@types/tern" "*" -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/cytoscape@^3.14.5": - version "3.14.5" - resolved "https://registry.yarnpkg.com/@types/cytoscape/-/cytoscape-3.14.5.tgz#a8ab5d82250be9bce207e269f3b6dab4666c4a2c" - integrity sha512-FhmhUAabEQZ8wTKkvuwPlF3nxvwUrTwb1Oie5M7v9wdcHQu5vSDXh/+4eWRBLjcONpFXGhH44L9oXNqyI2R4yQ== - -"@types/debug@^4.1.5": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" - integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== +"@types/cytoscape@": + version "3.19.2" + resolved "https://registry.yarnpkg.com/@types/cytoscape/-/cytoscape-3.19.2.tgz#cd5fed34add5c513cd00adf53a196f8aab8e7c69" + integrity sha512-naM/VSuE9FVVmj4ef3FZDEiDltqvm7jnOnbnWDRWfGB4jN/9b2XfYnOGGK5i6E24AlN2mUR+tGTORYPPp5i3Qw== -"@types/diff@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/diff/-/diff-4.0.2.tgz#2e9bb89f9acc3ab0108f0f3dc4dbdcf2fff8a99c" - integrity sha512-mIenTfsIe586/yzsyfql69KRnA75S8SVXQbTLpDejRrjH0QSJcpu3AUOi/Vjnt9IOsXKxPhJfGpQUNMueIU1fQ== - -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== +"@types/debug@^4.1.6": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" -"@types/estree@*": - version "0.0.44" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21" - integrity sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g== +"@types/diff@": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-5.0.1.tgz#9c9b9a331d4e41ccccff553f5d7ef964c6cf4042" + integrity sha512-XIpxU6Qdvp1ZE6Kr3yrkv1qgUab0fyf4mHYvW8N3Bx3PCsbN6or1q9/q72cv5jIFWolaGH08U9XyYoLLIykyKQ== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/estree@*", "@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== -"@types/fs-extra@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.0.tgz#1114834b53c3914806cd03b3304b37b3bd221a4d" - integrity sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg== +"@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== dependencies: "@types/node" "*" "@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: - "@types/events" "*" "@types/minimatch" "*" "@types/node" "*" "@types/html-minifier-terser@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.0.0.tgz#7532440c138605ced1b555935c3115ddd20e8bef" - integrity sha512-q95SP4FdkmF0CwO0F2q0H6ZgudsApaY/yCtAQNRn1gduef5fGpyEphzy0YCq/N0UFvDSnLg5V8jFK/YGXlDiCw== + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" + integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== -"@types/json-schema@^7.0.3": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" - integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== +"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/lodash@^4.14.149": - version "4.14.149" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440" - integrity sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ== +"@types/lodash@": + version "4.14.178" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" + integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== "@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== -"@types/node@*": - version "13.11.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b" - integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ== +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@12.12.21": - version "12.12.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.21.tgz#aa44a6363291c7037111c47e4661ad210aded23f" - integrity sha512-8sRGhbpU+ck1n0PGAUgVrWrWdjSW2aqNeyC15W88GRsMpSwzv6RJGlLhE7s2RhVSOdyDmxbqlWSeThq4/7xqlA== +"@types/node@", "@types/node@*": + version "16.11.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.12.tgz#ac7fb693ac587ee182c3780c26eb65546a1a3c10" + integrity sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw== -"@types/node@^12.0.12": - version "12.12.34" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.34.tgz#0a5d6ae5d22612f0cf5f10320e1fc5d2a745dcb8" - integrity sha512-BneGN0J9ke24lBRn44hVHNeDlrXRYF+VRp0HbSUNnEZahXGAysHZIqnf/hER6aabdBgzM4YOV4jrR8gj4Zfi0g== +"@types/node@^14.6.2": + version "14.18.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.0.tgz#98df2397f6936bfbff4f089e40e06fa5dd88d32a" + integrity sha512-0GeIl2kmVMXEnx8tg1SlG6Gg8vkqirrW752KqolYo1PHevhhZN3bhJ67qHj+bQaINhX0Ra3TlWwRvMCd9iEfNQ== -"@types/prop-types@*": - version "15.7.3" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== +"@types/plist@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01" + integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" -"@types/q@^1.5.1": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" - integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/prop-types@*": + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== -"@types/react-dom@^16.9.6": - version "16.9.6" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.6.tgz#9e7f83d90566521cc2083be2277c6712dcaf754c" - integrity sha512-S6ihtlPMDotrlCJE9ST1fRmYrQNNwfgL61UB4I1W7M6kPulUKx9fXAleW5zpdIjUQ4fTaaog8uERezjsGUj9HQ== +"@types/react-dom@^16": + version "16.9.14" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.14.tgz#674b8f116645fe5266b40b525777fc6bb8eb3bcd" + integrity sha512-FIX2AVmPTGP30OUJ+0vadeIFJJ07Mh1m+U0rxfgyW34p3rTlXI+nlenvAxNn4BP36YyI9IJ/+UJ7Wu22N1pI7A== dependencies: - "@types/react" "*" + "@types/react" "^16" -"@types/react-virtualized@^9.21.10": - version "9.21.10" - resolved "https://registry.yarnpkg.com/@types/react-virtualized/-/react-virtualized-9.21.10.tgz#cd072dc9c889291ace2c4c9de8e8c050da8738b7" - integrity sha512-f5Ti3A7gGdLkPPFNHTrvKblpsPNBiQoSorOEOD+JPx72g/Ng2lOt4MYfhvQFQNgyIrAro+Z643jbcKafsMW2ag== +"@types/react-virtualized@^9.21.0": + version "9.21.15" + resolved "https://registry.yarnpkg.com/@types/react-virtualized/-/react-virtualized-9.21.15.tgz#349a4f9774504e514ea4c8ebbbfe6cc8db17f045" + integrity sha512-R4ntUW+Y/a7RgRpfeYz3iRe+kaDWtXieMeQum4AoYjjZsR/QhpKqFu4muSBhzA7OHJHd6qA0KkeTzxj5ah5tmQ== dependencies: "@types/prop-types" "*" "@types/react" "*" -"@types/react-window@^1.8.2": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.2.tgz#a5a6b2762ce73ffaab7911ee1397cf645f2459fe" - integrity sha512-gP1xam68Wc4ZTAee++zx6pTdDAH08rAkQrWm4B4F/y6hhmlT9Mgx2q8lTCXnrPHXsr15XjRN9+K2DLKcz44qEQ== +"@types/react-window@": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1" + integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.9.17": - version "16.9.32" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383" - integrity sha512-fmejdp0CTH00mOJmxUPPbWCEBWPvRIL4m8r0qD+BSDUqmutPyGQCHifzMpMzdvZwROdEdL78IuZItntFWgPXHQ== +"@types/react@*": + version "17.0.37" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.37.tgz#6884d0aa402605935c397ae689deed115caad959" + integrity sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react@^16": + version "16.14.21" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.21.tgz#35199b21a278355ec7a3c40003bd6a334bd4ae4a" + integrity sha512-rY4DzPKK/4aohyWiDRHS2fotN5rhBSK6/rz1X37KzNna9HJyqtaGAbq9fVttrEPWF5ywpfIP1ITL8Xi2QZn6Eg== dependencies: "@types/prop-types" "*" - csstype "^2.2.0" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/source-list-map@*": version "0.1.2" resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== -"@types/tapable@*", "@types/tapable@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.5.tgz#9adbc12950582aa65ead76bffdf39fe0c27a3c02" - integrity sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ== +"@types/tapable@^1", "@types/tapable@^1.0.5": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== "@types/tern@*": - version "0.23.3" - resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.3.tgz#4b54538f04a88c9ff79de1f6f94f575a7f339460" - integrity sha512-imDtS4TAoTcXk0g7u4kkWqedB3E4qpjXzCpD2LU5M5NAXHzCDsypyvXSaG7mM8DKYkCRa7tFp4tS/lp/Wo7Q3w== + version "0.23.4" + resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.4.tgz#03926eb13dbeaf3ae0d390caf706b2643a0127fb" + integrity sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg== dependencies: "@types/estree" "*" "@types/uglify-js@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.5.tgz#2c70d5c68f6e002e3b2e4f849adc5f162546f633" - integrity sha512-L7EbSkhSaWBpkl+PZAEAqZTqtTeIsq7s/oX/q0LNnxxJoRVKQE0T81XDVyaxjiiKQwiV2vhVeYRqxdRNqGOGJw== + version "3.13.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" + integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== dependencies: source-map "^0.6.1" +"@types/verror@^1.10.3": + version "1.10.5" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.5.tgz#2a1413aded46e67a1fe2386800e291123ed75eb1" + integrity sha512-9UjMCHK5GPgQRoNbqdLIAvAy0EInuiqbW0PBMtVP6B5B2HQJlvoJHM+KodPZMEjOa5VkSc+5LH7xy+cUzQdmHw== + "@types/webpack-env@^1.15.1": - version "1.15.1" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.1.tgz#c8e84705e08eed430b5e15b39c65b0944e4d1422" - integrity sha512-eWN5ElDTeBc5lRDh95SqA8x18D0ll2pWudU3uWiyfsRmIZcmUXpEsxPU+7+BsdCrO2vfLRC629u/MmjbmF+2tA== + version "1.16.3" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.3.tgz#b776327a73e561b71e7881d0cd6d34a1424db86a" + integrity sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw== "@types/webpack-sources@*": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.7.tgz#0a330a9456113410c74a5d64180af0cbca007141" - integrity sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw== + version "3.2.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" + integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== dependencies: "@types/node" "*" "@types/source-list-map" "*" - source-map "^0.6.1" + source-map "^0.7.3" "@types/webpack@^4.41.8": - version "4.41.10" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.10.tgz#2e1f6b3508a249854efe3dcc7690905ac5ee10be" - integrity sha512-vIy0qaq8AjOjZLuFPqpo7nAJzcoVXMdw3mvpNN07Uvdy0p1IpJeLNBe3obdRP7FX2jIusDE7z1pZa0A6qYUgnA== + version "4.41.32" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212" + integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg== dependencies: - "@types/anymatch" "*" "@types/node" "*" - "@types/tapable" "*" + "@types/tapable" "^1" "@types/uglify-js" "*" "@types/webpack-sources" "*" + anymatch "^3.0.0" source-map "^0.6.0" "@types/yargs-parser@*": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" - integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== -"@types/yargs@^15.0.4": - version "15.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.4.tgz#7e5d0f8ca25e9d5849f2ea443cf7c402decd8299" - integrity sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg== +"@types/yargs@^17.0.1": + version "17.0.7" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.7.tgz#44a484c634761da4391477515a98772b82b5060f" + integrity sha512-OvLKmpKdea1aWtqHv9bxVVcMoT6syAeK+198dfETIFkAevYRGwqh4H+KFxfjUETZuUuE5sQCAFwdOdoHUdo8eg== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^2.28.0": - version "2.28.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.28.0.tgz#4431bc6d3af41903e5255770703d4e55a0ccbdec" - integrity sha512-w0Ugcq2iatloEabQP56BRWJowliXUP5Wv6f9fKzjJmDW81hOTBxRoJ4LoEOxRpz9gcY51Libytd2ba3yLmSOfg== - dependencies: - "@typescript-eslint/experimental-utils" "2.28.0" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@2.28.0": - version "2.28.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.28.0.tgz#1fd0961cd8ef6522687b4c562647da6e71f8833d" - integrity sha512-4SL9OWjvFbHumM/Zh/ZeEjUFxrYKtdCi7At4GyKTbQlrj1HcphIDXlje4Uu4cY+qzszR5NdVin4CCm6AXCjd6w== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.28.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/experimental-utils@2.29.0": - version "2.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.29.0.tgz#3cb8060de9265ba131625a96bbfec31ba6d4a0fe" - integrity sha512-H/6VJr6eWYstyqjWXBP2Nn1hQJyvJoFdDtsHxGiD+lEP7piGnGpb/ZQd+z1ZSB1F7dN+WsxUDh8+S4LwI+f3jw== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.29.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@^2.24.0": - version "2.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.29.0.tgz#6e3c4e21ed6393dc05b9d8b47f0b7e731ef21c9c" - integrity sha512-H78M+jcu5Tf6m/5N8iiFblUUv+HJDguMSdFfzwa6vSg9lKR8Mk9BsgeSjO8l2EshKnJKcbv0e8IDDOvSNjl0EA== - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.29.0" - "@typescript-eslint/typescript-estree" "2.29.0" - eslint-visitor-keys "^1.1.0" - -"@typescript-eslint/parser@^2.28.0": - version "2.28.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.28.0.tgz#bb761286efd2b0714761cab9d0ee5847cf080385" - integrity sha512-RqPybRDquui9d+K86lL7iPqH6Dfp9461oyqvlXMNtap+PyqYbkY5dB7LawQjDzot99fqzvS0ZLZdfe+1Bt3Jgw== - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.28.0" - "@typescript-eslint/typescript-estree" "2.28.0" - eslint-visitor-keys "^1.1.0" - -"@typescript-eslint/typescript-estree@2.28.0": - version "2.28.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.28.0.tgz#d34949099ff81092c36dc275b6a1ea580729ba00" - integrity sha512-HDr8MP9wfwkiuqzRVkuM3BeDrOC4cKbO5a6BymZBHUt5y/2pL0BXD6I/C/ceq2IZoHWhcASk+5/zo+dwgu9V8Q== +"@types/zeromq@^5.2.1": + version "5.2.1" + resolved "https://registry.yarnpkg.com/@types/zeromq/-/zeromq-5.2.1.tgz#f4316166e90fbe01e25ec6a6efa84e9bc8f91314" + integrity sha512-B6fUT5ZanWEyKSmLLEA0K3zNPvVedrjL6LNZWAt1eOpNg0J2lw14ismPJeOrgPf3SzRuNhPReQWibHbnMrtRow== dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^6.3.0" - tsutils "^3.17.1" + "@types/node" "*" -"@typescript-eslint/typescript-estree@2.29.0": - version "2.29.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.29.0.tgz#1be6612bb02fc37ac9f466521c1459a4744e8d3a" - integrity sha512-3YGbtnWy4az16Egy5Fj5CckkVlpIh0MADtAQza+jiMADRSKkjdpzZp/5WuvwK/Qib3Z0HtzrDFeWanS99dNhnA== +"@typescript-eslint/eslint-plugin@": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.6.0.tgz#efd8668b3d6627c46ce722c2afe813928fe120a0" + integrity sha512-MIbeMy5qfLqtgs1hWd088k1hOuRsN9JrHUPwVVKCD99EOUqScd7SrwoZl4Gso05EAP9w1kvLWUVGJOVpRPkDPA== dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^6.3.0" - tsutils "^3.17.1" + "@typescript-eslint/experimental-utils" "5.6.0" + "@typescript-eslint/scope-manager" "5.6.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz#f3a5960f2004abdcac7bb81412bafc1560841c23" + integrity sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.6.0" + "@typescript-eslint/types" "5.6.0" + "@typescript-eslint/typescript-estree" "5.6.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.6.0.tgz#11677324659641400d653253c03dcfbed468d199" + integrity sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ== + dependencies: + "@typescript-eslint/scope-manager" "5.6.0" + "@typescript-eslint/types" "5.6.0" + "@typescript-eslint/typescript-estree" "5.6.0" + debug "^4.3.2" + +"@typescript-eslint/scope-manager@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.6.0.tgz#9dd7f007dc8f3a34cdff6f79f5eaab27ae05157e" + integrity sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A== + dependencies: + "@typescript-eslint/types" "5.6.0" + "@typescript-eslint/visitor-keys" "5.6.0" + +"@typescript-eslint/types@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.6.0.tgz#745cb1b59daadcc1f32f7be95f0f68accf38afdd" + integrity sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA== + +"@typescript-eslint/typescript-estree@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz#dfbb19c9307fdd81bd9c650c67e8397821d7faf0" + integrity sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA== + dependencies: + "@typescript-eslint/types" "5.6.0" + "@typescript-eslint/visitor-keys" "5.6.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz#3e36509e103fe9713d8f035ac977235fd63cb6e6" + integrity sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng== + dependencies: + "@typescript-eslint/types" "5.6.0" + eslint-visitor-keys "^3.0.0" "@webassemblyjs/ast@1.9.0": version "1.9.0" @@ -1444,25 +1609,25 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^6.2.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== +acorn@^8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" + integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" @@ -1472,91 +1637,57 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== - -ajv@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" - integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.1, ajv@^6.10.2, ajv@^6.12.0: - version "6.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" - integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== +ajv@6.12.6, ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.1, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= - dependencies: - string-width "^2.0.0" - ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== dependencies: - string-width "^3.0.0" + string-width "^4.1.0" ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= +ansi-html-community@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -1566,11 +1697,10 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" anymatch@^2.0.0: @@ -1581,48 +1711,59 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -app-builder-bin@3.5.5: - version "3.5.5" - resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.5.5.tgz#c83200dccd8df5ccb2a5adcd41b2a76bacfb531a" - integrity sha512-ZcHzJ9Xl+azPqdKzXZKdRZmkNmbxHHZyl4cbobNf8qMQpoPChpcov8riVrZSbu/0cT/JqJ8LOwJjy1OAwbChaQ== - -app-builder-lib@22.4.1, app-builder-lib@~22.4.1: - version "22.4.1" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-22.4.1.tgz#9d73b2834e434fb65fc9571ae3fed3c1470b6915" - integrity sha512-epwUzIM+2pcdy/If9koTP74CKx4v7xGPj75a2Z5cM4rrGN9yVZ3eDUBbfF0e0qE4Qmcv5pd0BAZJ26bGm8NWsQ== +anymatch@^3.0.0, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: - "7zip-bin" "~5.0.3" - "@develar/schema-utils" "~2.1.0" + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-builder-bin@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.7.1.tgz#cb0825c5e12efc85b196ac3ed9c89f076c61040e" + integrity sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw== + +app-builder-lib@22.14.5: + version "22.14.5" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-22.14.5.tgz#a61a50b132b858e98fdc70b6b88994ae99b4f96d" + integrity sha512-k3VwKP4kpsnUaXoUkm1s4zaSHPHIMFnN4kPMU9yXaKmE1LfHHqBaEah5bXeTAX5V/BC41wFdg8CF5vOjvgy8Rg== + dependencies: + "7zip-bin" "~5.1.1" + "@develar/schema-utils" "~2.6.5" + "@electron/universal" "1.0.5" + "@malept/flatpak-bundler" "^0.4.0" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "22.4.1" - builder-util-runtime "8.6.2" + builder-util "22.14.5" + builder-util-runtime "8.9.1" chromium-pickle-js "^0.2.0" - debug "^4.1.1" - ejs "^3.0.1" - electron-publish "22.4.1" - fs-extra "^8.1.0" - hosted-git-info "^3.0.4" - is-ci "^2.0.0" - isbinaryfile "^4.0.4" - js-yaml "^3.13.1" - lazy-val "^1.0.4" + debug "^4.3.2" + ejs "^3.1.6" + electron-osx-sign "^0.5.0" + electron-publish "22.14.5" + form-data "^4.0.0" + fs-extra "^10.0.0" + hosted-git-info "^4.0.2" + is-ci "^3.0.0" + isbinaryfile "^4.0.8" + js-yaml "^4.1.0" + lazy-val "^1.0.5" minimatch "^3.0.4" - normalize-package-data "^2.5.0" - read-config-file "5.0.2" + read-config-file "6.2.0" sanitize-filename "^1.6.3" - semver "^7.1.3" - temp-file "^3.3.7" + semver "^7.3.5" + temp-file "^3.4.0" aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -arch@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.2.tgz#0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf" - integrity sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ== +arch@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== arg@2.0.0: version "2.0.0" @@ -1636,6 +1777,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + aria-query@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" @@ -1669,14 +1815,16 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== +array-includes@^3.1.3, array-includes@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" - is-string "^1.0.5" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + is-string "^1.0.7" array-union@^1.0.1: version "1.0.2" @@ -1685,6 +1833,11 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -1695,31 +1848,50 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== +array.prototype.flat@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" + integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + +array.prototype.flatmap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" + integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.19.0" -array.prototype.flatmap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" - integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== +asar@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-3.1.0.tgz#70b0509449fe3daccc63beb4d3c7d2e24d3c6473" + integrity sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + optionalDependencies: + "@types/glob" "^7.1.1" -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert@^1.1.1: version "1.5.0" @@ -1739,10 +1911,10 @@ ast-types-flow@^0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-each@^1.0.1: version "1.0.3" @@ -1759,6 +1931,11 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -1766,6 +1943,11 @@ async@^2.6.2: dependencies: lodash "^4.17.14" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" @@ -1776,37 +1958,24 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" - integrity sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ= - dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" - -axe-core@^3.5.4: - version "3.5.5" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-3.5.5.tgz#84315073b53fa3c0c51676c588d59da09a192227" - integrity sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q== +axe-core@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.5.tgz#78d6911ba317a8262bfee292aeafcc1e04b49cc5" + integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA== -axobject-query@^2.1.2: +axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-loader@^8.0.6, babel-loader@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" - integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== +babel-loader@^8.1.0, babel-loader@^8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" + integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== dependencies: - find-cache-dir "^2.1.0" + find-cache-dir "^3.3.1" loader-utils "^1.4.0" - mkdirp "^0.5.3" - pify "^4.0.1" + make-dir "^3.1.0" schema-utils "^2.6.5" babel-plugin-component@^1.1.1: @@ -1816,35 +1985,46 @@ babel-plugin-component@^1.1.1: dependencies: "@babel/helper-module-imports" "7.0.0-beta.35" -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" -babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" + integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087" + integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" + "@babel/helper-define-polyfill-provider" "^0.3.0" + core-js-compat "^3.18.0" -balanced-match@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" + integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.0.2, base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base@^0.11.1: version "0.11.2" @@ -1874,6 +2054,11 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -1888,15 +2073,20 @@ bluebird-lst@^1.0.9: dependencies: bluebird "^3.5.5" -bluebird@^3.5.4, bluebird@^3.5.5, bluebird@^3.7.2: +bluebird@^3.5.0, bluebird@^3.5.5, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== body-parser@1.19.0: version "1.19.0" @@ -1926,42 +2116,29 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" -boolbase@^1.0.0, boolbase@~1.0.0: +boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -boolean@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.1.tgz#35ecf2b4a2ee191b0b44986f14eb5f052a5cbb4f" - integrity sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA== +boolean@^3.0.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.1.4.tgz#f51a2fb5838a99e06f9b6ec1edb674de67026435" + integrity sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w== -boxen@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - -boxen@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" - integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== +boxen@5.1.2, boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== dependencies: ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^3.0.0" - cli-boxes "^2.2.0" - string-width "^4.1.0" - term-size "^2.1.0" - type-fest "^0.8.1" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" widest-line "^3.1.0" + wrap-ansi "^7.0.0" brace-expansion@^1.1.7: version "1.1.11" @@ -1987,7 +2164,14 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -brorand@^1.0.1: +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= @@ -2023,26 +2207,28 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: - bn.js "^4.1.0" + bn.js "^5.0.0" randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" browserify-zlib@^0.2.0: version "0.2.0" @@ -2051,33 +2237,49 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - integrity sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk= +browserslist@^4.17.5, browserslist@^4.18.1: + version "4.18.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" + integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" + caniuse-lite "^1.0.30001280" + electron-to-chromium "^1.3.896" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" -browserslist@^4.8.3, browserslist@^4.9.1: - version "4.11.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.1.tgz#92f855ee88d6e050e7e7311d987992014f1a1f1b" - integrity sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g== +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== dependencies: - caniuse-lite "^1.0.30001038" - electron-to-chromium "^1.3.390" - node-releases "^1.1.53" - pkg-up "^2.0.0" + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= +buffer-equal@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-indexof@^1.0.0: version "1.1.1" @@ -2098,33 +2300,42 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -builder-util-runtime@8.6.2: - version "8.6.2" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.6.2.tgz#8270e15b012d8d3b110f3e327b0fd8b0e07b1686" - integrity sha512-9QnIBISfhgQ2BxtRLidVqf/v5HD73vSKZDllpUmGd2L6VORGQk7cZAPmPtw4HQM3gPBelyVJ5yIjMNZ8xjmd1A== +buffer@^5.1.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: - debug "^4.1.1" + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builder-util-runtime@8.9.1: + version "8.9.1" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz#25f066b3fbc20b3e6236a9b956b1ebb0e33ff66a" + integrity sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg== + dependencies: + debug "^4.3.2" sax "^1.2.4" -builder-util@22.4.1, builder-util@~22.4.1: - version "22.4.1" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.4.1.tgz#49cce9f06a62cdccda66d5efa82077040fa1f462" - integrity sha512-+ysLc7cC4w6P7rBxmZ5X2aU3QvcwFoWCl1us+mcUKdsGmJAtFUMPJqueeptdxjyPrPShIUOKHzA8uk5A3d1fHg== +builder-util@22.14.5: + version "22.14.5" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.14.5.tgz#42a18608d2a566c0846e91266464776c8bfb0cc9" + integrity sha512-zqIHDFJwmA7jV7SC9aI+33MWwT2mWoijH+Ol9IntNAwuuRXoS+7XeJwnhLBXOhcDBzXT4kDzHnRk4JKeaygEYA== dependencies: - "7zip-bin" "~5.0.3" - "@types/debug" "^4.1.5" - "@types/fs-extra" "^8.1.0" - app-builder-bin "3.5.5" + "7zip-bin" "~5.1.1" + "@types/debug" "^4.1.6" + "@types/fs-extra" "^9.0.11" + app-builder-bin "3.7.1" bluebird-lst "^1.0.9" - builder-util-runtime "8.6.2" - chalk "^3.0.0" - debug "^4.1.1" - fs-extra "^8.1.0" - is-ci "^2.0.0" - js-yaml "^3.13.1" - source-map-support "^0.5.16" + builder-util-runtime "8.9.1" + chalk "^4.1.1" + cross-spawn "^7.0.3" + debug "^4.3.2" + fs-extra "^10.0.0" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" stat-mode "^1.0.0" - temp-file "^3.3.7" + temp-file "^3.4.0" builtin-status-codes@^3.0.0: version "3.0.0" @@ -2214,55 +2425,48 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" - integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: - pascal-case "^3.1.1" - tslib "^1.10.0" - -camelcase@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + pascal-case "^3.1.2" + tslib "^2.0.3" camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - integrity sha1-tTTnxzTE+B7F++isoq0kNUuWLGw= - dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30001039" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001039.tgz#b5e8c3bb07a144341644729fa2a5eb2c0deaf47d" - integrity sha512-XVk5KMAi8/DI28tQXKuq1PDyuPoD9Ypnda3ctF04TlB+LYIb+bgHq0ZDfNOn0+4cwLENJC0093Vuf0dhkjXQ7Q== +camelcase@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" + integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== -caniuse-lite@^1.0.30001038: - version "1.0.30001039" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz#b3814a1c38ffeb23567f8323500c09526a577bbe" - integrity sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q== +caniuse-lite@^1.0.30001280: + version "1.0.30001286" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz#3e9debad420419618cfdf52dc9b6572b28a8fff6" + integrity sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ== -catharsis@^0.8.11: - version "0.8.11" - resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.11.tgz#d0eb3d2b82b7da7a3ce2efb1a7b00becc6643468" - integrity sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g== +catharsis@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" + integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== dependencies: - lodash "^4.17.14" + lodash "^4.17.15" chalk@2.4.1: version "2.4.1" @@ -2273,7 +2477,7 @@ chalk@2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2282,38 +2486,14 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4. escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -2333,17 +2513,30 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" +chokidar@^3.4.0, chokidar@^3.4.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chownr@^1.1.1, chownr@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== chromium-pickle-js@^0.2.0: version "0.2.0" @@ -2355,6 +2548,11 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -2363,13 +2561,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== - dependencies: - chalk "^1.1.3" - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -2380,15 +2571,10 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.5: - version "2.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" - integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== - clean-css@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" - integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + version "4.2.4" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" + integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== dependencies: source-map "~0.6.0" @@ -2397,44 +2583,27 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= - -cli-boxes@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" - integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^2.0.0: +cli-boxes@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== -clipboardy@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef" - integrity sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA== +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: - arch "^2.1.0" - execa "^0.8.0" + slice-ansi "^3.0.0" + string-width "^4.2.0" -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== +clipboardy@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290" + integrity sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ== dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" + arch "^2.1.1" + execa "^1.0.0" + is-wsl "^2.1.1" cliui@^5.0.0: version "5.0.0" @@ -2454,6 +2623,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -2461,41 +2639,15 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -clsx@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.0.tgz#62937c6adfea771247c34b54d320fb99624f5702" - integrity sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA== - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= - dependencies: - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +clsx@^1.0.4, clsx@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== -codemirror@^5.52.2: - version "5.52.2" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.52.2.tgz#c29e1f7179f85eb0dd17c0586fa810e4838ff584" - integrity sha512-WCGCixNUck2HGvY8/ZNI1jYfxPG5cRHv0VjmWuNzbtCLz8qYA5d+je4QhSSCtCaagyeOwMi/HmmPTjBgiTm2lQ== +codemirror@^5.64.0: + version "5.64.0" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.64.0.tgz#182eec65b62178e3cd1de8f9d88ab819cfe5f625" + integrity sha512-fqr6CtDQdJ6iNMbD8NX2gH2G876nNDk+TO1rrYkgWnqQdO3O1Xa9tK6q+psqhJJgE5SpbaDcgdfLmukoUVE8pg== collection-visit@^1.0.0: version "1.0.0" @@ -2505,7 +2657,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.3.0, color-convert@^1.9.0: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -2524,42 +2676,31 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE= - dependencies: - color-name "^1.0.0" +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -color@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q= +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" + delayed-stream "~1.0.0" -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - integrity sha1-6i90IKcrlogaOKrlnsEkpvcpgTM= +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" - -colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= + graceful-readlink ">= 1.0.0" -commander@^2.19.0, commander@^2.20.0: +commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -2569,11 +2710,21 @@ commander@^4.0.1, commander@^4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= + component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -2628,9 +2779,9 @@ concat-stream@^1.5.0, concat-stream@^1.6.2: typedarray "^0.0.6" config-chain@^1.1.11: - version "1.1.12" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== dependencies: ini "^1.3.4" proto-list "~1.2.1" @@ -2647,10 +2798,10 @@ configstore@^5.0.1: write-file-atomic "^3.0.0" xdg-basedir "^4.0.0" -confusing-browser-globals@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" - integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== +confusing-browser-globals@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== connect-history-api-fallback@^1.6.0: version "1.6.0" @@ -2667,11 +2818,6 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" @@ -2690,9 +2836,9 @@ content-type@~1.0.4: integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@^1.1.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" @@ -2723,34 +2869,29 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.6.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" - integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== +core-js-compat@^3.18.0, core-js-compat@^3.19.1: + version "3.19.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.3.tgz#de75e5821c5ce924a0a1e7b7d5c2cb973ff388aa" + integrity sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA== dependencies: - browserslist "^4.8.3" + browserslist "^4.18.1" semver "7.0.0" -core-js-pure@^3.0.0: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" - integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== - -core-js@^2.4.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== +core-js-pure@^3.19.0: + version "3.19.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.19.3.tgz#c69b2b36b58927317824994b532ec3f0f7e49607" + integrity sha512-N3JruInmCyt7EJj5mAq3csCgGYgiSqu7p7TQp2KOztr180/OAIxyIvL1FCjzgmQk/t3Yniua50Fsak7FShI9lA== -core-js@^3.6.4: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== - -core-util-is@~1.0.0: +core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cose-base@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" @@ -2758,15 +2899,22 @@ cose-base@^1.0.0: dependencies: layout-base "^1.0.0" +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" - elliptic "^6.0.0" + elliptic "^6.5.3" -create-hash@^1.1.0, create-hash@^1.1.2: +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== @@ -2777,7 +2925,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -2796,7 +2944,7 @@ crocket@^0.9.11: dependencies: xpipe "*" -cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -2807,14 +2955,14 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= +cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" cross-unzip@0.0.2: version "0.0.2" @@ -2843,11 +2991,6 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-color-names@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - css-hot-loader@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/css-hot-loader/-/css-hot-loader-1.4.4.tgz#ae784932cd8b7d092f7f15702af08b3ec9436052" @@ -2857,194 +3000,123 @@ css-hot-loader@^1.4.4: lodash "^4.17.5" normalize-url "^1.9.1" -css-loader@^3.4.0, css-loader@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" - integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== +css-loader@^3.4.2: + version "3.6.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" + integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== dependencies: camelcase "^5.3.1" cssesc "^3.0.0" icss-utils "^4.1.1" loader-utils "^1.2.3" normalize-path "^3.0.0" - postcss "^7.0.23" + postcss "^7.0.32" postcss-modules-extract-imports "^2.0.0" postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.1.1" + postcss-modules-scope "^2.2.0" postcss-modules-values "^3.0.0" - postcss-value-parser "^4.0.2" - schema-utils "^2.6.0" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + postcss-value-parser "^4.1.0" + schema-utils "^2.7.0" + semver "^6.3.0" -css-select@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= +css-loader@^5: + version "5.2.7" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" + integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + icss-utils "^5.1.0" + loader-utils "^2.0.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.5" + +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== dependencies: boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-tree@1.0.0-alpha.39: - version "1.0.0-alpha.39" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" - integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== - dependencies: - mdn-data "2.0.6" - source-map "^0.6.1" - -css-what@2.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" -css-what@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" - integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== +css-what@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano@^3.4.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - integrity sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg= - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" - integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== - dependencies: - css-tree "1.0.0-alpha.39" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U= - dependencies: - clap "^1.0.9" - source-map "^0.5.3" - -csstype@^2.2.0, csstype@^2.6.7: - version "2.6.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" - integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== +csstype@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" + integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -cytoscape-cola@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/cytoscape-cola/-/cytoscape-cola-2.3.1.tgz#e281737b6a973cec53e2423129d14cf189490818" - integrity sha512-CJ+AbNxqsEPEr+bsUfMcgg3T2E9NkwWVx1u7a6wixdg3uD6aDQI5vX5I0+A19QIrpqNWrm5O8w3oXf/ZcJwwmA== +cytoscape-cola@: + version "2.5.0" + resolved "https://registry.yarnpkg.com/cytoscape-cola/-/cytoscape-cola-2.5.0.tgz#7365d9dfc1a577dd068232093f2f00147c0c0155" + integrity sha512-TCpzO+e7H7Bhi2uiAi2Nq7gFwcSGkffe1J6uQ7Dsx6SLN9OhIzrQkBkV6m8kHzar+flVbP76RwxAa2y97jdphA== dependencies: webcola "^3.4.0" -cytoscape-cose-bilkent@^4.1.0: +cytoscape-cose-bilkent@: version "4.1.0" resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== dependencies: cose-base "^1.0.0" -cytoscape-cxtmenu@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cytoscape-cxtmenu/-/cytoscape-cxtmenu-3.1.2.tgz#a183629fc53b58cdf82db601c2eed9eca41eefae" - integrity sha512-ikPWyNRZ6IfIykXU9J6tXkwu2Gk3nYK5yNmNJI/wtLFCuELdcCqpEXobgGLDT7yEGO+jI1upxmb4Lex/DPZlgA== +cytoscape-cxtmenu@: + version "3.4.0" + resolved "https://registry.yarnpkg.com/cytoscape-cxtmenu/-/cytoscape-cxtmenu-3.4.0.tgz#5ef4652b5a2e9718827adaab6467a28e0be21718" + integrity sha512-ZKaGUuYwNPcHc0DbiznfbWGz7IYcu1jmNJj14Jm0LO3IfjTJECWkQJ2RYVbQqcvQzydFemLTXs+8CAsIAcyAIA== -cytoscape-dagre@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/cytoscape-dagre/-/cytoscape-dagre-2.2.2.tgz#5f32a85c0ba835f167efee531df9e89ac58ff411" - integrity sha512-zsg36qNwua/L2stJSWkcbSDcvW3E6VZf6KRe6aLnQJxuXuz89tMqI5EVYVKEcNBgzTEzFMFv0PE3T0nD4m6VDw== +cytoscape-dagre@: + version "2.3.2" + resolved "https://registry.yarnpkg.com/cytoscape-dagre/-/cytoscape-dagre-2.3.2.tgz#f83d4357642c86d3bd7530dd9c1dffc2e1079d3c" + integrity sha512-dL9+RvGkatSlIdOKXiFwHpnpTo8ydFMqIYzZFkImJXNbDci3feyYxR46wFoaG9GFiWimc6XD9Lm0x29b1wvWpw== dependencies: - dagre "^0.8.2" + dagre "^0.8.5" -cytoscape-klay@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/cytoscape-klay/-/cytoscape-klay-3.1.3.tgz#d12faa6a39a709c4ff66d4020e1341ca26d51f50" - integrity sha512-Bq6WQRum5nojcOH1QGGihPoI5QRNJwxBlLAjpTYjNallZg3oH9/4o0a8jdUG9LIqSc1IDKFSHP2qylm7RURxxw== +cytoscape-klay@: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cytoscape-klay/-/cytoscape-klay-3.1.4.tgz#0e5bbb5c482b384b2ff2485150173aaecebc324b" + integrity sha512-VwPj0VR25GPfy6qXVQRi/MYlZM/zkdvRhHlgqbM//lSvstgM6fhp3ik/uM8Wr8nlhskfqz/M1fIDmR6UckbS2A== dependencies: klayjs "^0.4.1" -cytoscape-panzoom@^2.5.3: +cytoscape-panzoom@: version "2.5.3" resolved "https://registry.yarnpkg.com/cytoscape-panzoom/-/cytoscape-panzoom-2.5.3.tgz#edf041b5aa8be1cbe3c001f16a8b2193b46127a7" integrity sha512-//qLOqbbFUCGddarNKHDZArItOJHgnkQ1TvxI9nV2/8aOOl/5wuEOHmra3fL/aWSjB4AYpYTG4LX7w96uWfRTQ== dependencies: jquery "^1.4 || ^2.0 || ^3.0" -cytoscape-popper@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/cytoscape-popper/-/cytoscape-popper-1.0.7.tgz#8154ff507d0cc1a17952f00643e71fc1f8ea9fae" - integrity sha512-b/vfoBL2u9GU+J7eceGT9cZ4hctn/ZzV7PXq4w6fk+45qQuOHtlhpP3WxGKpBXNqENhk7Dk0BwlIYROjYQmidQ== +cytoscape-popper@: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cytoscape-popper/-/cytoscape-popper-2.0.0.tgz#d93917695a9b8af3dbda1d8ee433618ac4d4e359" + integrity sha512-b7WSOn8qXHWtdIXFNmrgc8qkaOs16tMY0EwtRXlxzvn8X+al6TAFrUwZoYATkYSlotfd/36ZMoeKMEoUck6feA== dependencies: - popper.js "^1.0.0" + "@popperjs/core" "^2.0.0" -cytoscape@^3.15.1, cytoscape@^3.2.19: - version "3.15.1" - resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.15.1.tgz#bb5724306c61dfb1500d20ce11cd90ef768fc32b" - integrity sha512-xU/0KYoCErDXseKiPYrJJRSwwxbaDSo2rNpKCd7uNPw7ZDrMahCo+fE0agVvw0ce+6gAg5bDnC1pT8AgmaqqtA== +cytoscape@, cytoscape@^3.2.19: + version "3.20.0" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.20.0.tgz#c626c1074f3a8a6f1bc58e8fbee8fd798a6fcbf3" + integrity sha512-V2OUoav8ltY9UPgdjuhQOqkkWT28IbJODioWCjcnLqmjym9lMpnD0ie0vdQCdAiZapjbTGAv8aoKmmSuVcC1gA== dependencies: heap "^0.2.6" lodash.debounce "^4.0.8" @@ -3068,9 +3140,9 @@ d3-path@1: integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== d3-selection@1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.1.tgz#98eedbbe085fbda5bafa2f9e3f3a2f4d7d622a98" - integrity sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA== + version "1.4.2" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" + integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg== d3-shape@^1.3.5: version "1.3.7" @@ -3084,7 +3156,7 @@ d3-timer@^1.0.5: resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== -dagre@^0.8.2: +dagre@^0.8.5: version "0.8.5" resolved "https://registry.yarnpkg.com/dagre/-/dagre-0.8.5.tgz#ba30b0055dac12b6c1fcc247817442777d06afee" integrity sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw== @@ -3092,33 +3164,33 @@ dagre@^0.8.2: graphlib "^2.1.8" lodash "^4.17.15" -damerau-levenshtein@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" - integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== +damerau-levenshtein@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" + integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== +debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: - ms "^2.1.1" + ms "2.1.2" -decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -3152,10 +3224,10 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-gateway@^4.2.0: version "4.2.0" @@ -3199,11 +3271,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -3217,6 +3284,11 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3241,11 +3313,11 @@ detect-file@^1.0.0: integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -diff@^5.0.0: +diff@: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== @@ -3259,18 +3331,50 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -dmg-builder@22.4.1: - version "22.4.1" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.4.1.tgz#ab80d3d6e4ed8a1d38beddbfe97c8f7a794dd932" - integrity sha512-hEemh7n0zoVt7zPPwvn7iOttP03oENjJ4ApttPmt8oDnX8T4q42MjGWyDlLkPMplMJfoTxkkNqmm296f0OYM8Q== +dir-compare@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631" + integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA== dependencies: - app-builder-lib "~22.4.1" - bluebird-lst "^1.0.9" - builder-util "~22.4.1" - fs-extra "^8.1.0" - iconv-lite "^0.5.1" - js-yaml "^3.13.1" - sanitize-filename "^1.6.3" + buffer-equal "1.0.0" + colors "1.0.3" + commander "2.9.0" + minimatch "3.0.4" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dmg-builder@22.14.5: + version "22.14.5" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.14.5.tgz#137c0b55e639badcc0b119eb060e6fa4ed61d948" + integrity sha512-1GvFGQE332bvPamcMwZDqWqfWfJTyyDLOsHMcGi0zs+Jh7JOn6/zuBkHJIWHdsj2QJbhzLVyd2/ZqttOKv7I8w== + dependencies: + app-builder-lib "22.14.5" + builder-util "22.14.5" + builder-util-runtime "8.9.1" + fs-extra "^10.0.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.9" + +dmg-license@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.10.tgz#89f52afae25d827fce8d818c13aff30af1c16bcc" + integrity sha512-SVeeyiOeinV5JCPHXMdKOgK1YVbak/4+8WL2rBnfqRYpA5FaeFaQnQWb25x628am1w70CbipGDv9S51biph63A== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" dns-equal@^1.0.0: version "1.0.0" @@ -3278,9 +3382,9 @@ dns-equal@^1.0.0: integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" @@ -3292,14 +3396,6 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -3314,27 +3410,28 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-converter@^0.2: +dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== dependencies: utila "~0.4" -dom-helpers@^5.0.0: - version "5.1.4" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" - integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A== +dom-helpers@^5.1.3: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" - csstype "^2.6.7" + csstype "^3.0.2" -dom-serializer@0, dom-serializer@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== dependencies: domelementtype "^2.0.1" + domhandler "^4.2.0" entities "^2.0.0" dom-walk@^0.1.0: @@ -3347,67 +3444,46 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@1, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== domhandler@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9" - integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw== + version "3.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" + integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== dependencies: domelementtype "^2.0.1" -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1, domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" + integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== dependencies: - dom-serializer "0" - domelementtype "1" + domelementtype "^2.2.0" -domutils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.0.0.tgz#15b8278e37bfa8468d157478c58c367718133c08" - integrity sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg== +domutils@^2.0.0, domutils@^2.5.2, domutils@^2.6.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: - dom-serializer "^0.2.1" - domelementtype "^2.0.1" - domhandler "^3.0.0" + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" -dot-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" - integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA== +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: - no-case "^3.0.3" - tslib "^1.10.0" + no-case "^3.0.4" + tslib "^2.0.3" dot-prop@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" - integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" @@ -3417,9 +3493,14 @@ dotenv-expand@^5.1.0: integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== dotenv@^8.0.0, dotenv@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== duplexer3@^0.1.4: version "0.1.4" @@ -3441,30 +3522,30 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.0.2.tgz#745b01cdcfe38c1c6a2da3bbb2d9957060a31226" - integrity sha512-IncmUpn1yN84hy2shb0POJ80FWrfGNY0cxO9f4v+/sG7qcBvAtVWUA1IdzY/8EYUmOVhoKJVdJjNd3AZcnxOjA== - -electron-builder@^22.4.1: - version "22.4.1" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.4.1.tgz#7a7a2cbd9955c90cecc36de32ecba7f565265bab" - integrity sha512-13CjZcGeJS+c3EKRwFT/Oty5Niif5g1FwDioBLEbjkPCPQgxdtDsr+rJtCu9qxkiKDYpAoPS+t/clNk0efONvQ== - dependencies: - "@types/yargs" "^15.0.4" - app-builder-lib "22.4.1" - bluebird-lst "^1.0.9" - builder-util "22.4.1" - builder-util-runtime "8.6.2" - chalk "^3.0.0" - dmg-builder "22.4.1" - fs-extra "^8.1.0" - is-ci "^2.0.0" - lazy-val "^1.0.4" - read-config-file "5.0.2" - sanitize-filename "^1.6.3" - update-notifier "^4.1.0" - yargs "^15.1.0" +ejs@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + dependencies: + jake "^10.6.1" + +electron-builder@^22.14.5: + version "22.14.5" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.14.5.tgz#3a25547bd4fe3728d4704da80956a794c5c31496" + integrity sha512-N73hSbXFz6Mz5Z6h6C5ly6CB+dUN6k1LuCDJjI8VF47bMXv/QE0HE+Kkb0GPKqTqM7Hsk/yIYX+kHCfSkR5FGg== + dependencies: + "@types/yargs" "^17.0.1" + app-builder-lib "22.14.5" + builder-util "22.14.5" + builder-util-runtime "8.9.1" + chalk "^4.1.1" + dmg-builder "22.14.5" + fs-extra "^10.0.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.2.0" + update-notifier "^5.1.0" + yargs "^17.0.1" electron-devtools-installer@^2.2.4: version "2.2.4" @@ -3476,33 +3557,45 @@ electron-devtools-installer@^2.2.4: rimraf "^2.5.2" semver "^5.3.0" -electron-devtools-installer@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-3.1.1.tgz#7b56c8c86475c5e4e10de6917d150c53c9ceb55e" - integrity sha512-g2D4J6APbpsiIcnLkFMyKZ6bOpEJ0Ltcc2m66F7oKUymyGAt628OWeU9nRZoh1cNmUs/a6Cls2UfOmsZtE496Q== +electron-devtools-installer@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-3.2.0.tgz#acc48d24eb7033fe5af284a19667e73b78d406d0" + integrity sha512-t3UczsYugm4OAbqvdImMCImIMVdFzJAHgbwHpkl5jmfu1izVgUcP/mnrPqJIpEeCK1uZGpt+yHgWEN+9EwoYhQ== dependencies: rimraf "^3.0.2" semver "^7.2.1" + tslib "^2.1.0" unzip-crx-3 "^0.2.0" -electron-publish@22.4.1: - version "22.4.1" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.4.1.tgz#a7fcf166786f7d5957f19a70ee8389f219769ba5" - integrity sha512-nwKNum3KXm+01rtWX2pc1jhazdzDy2zYnQx+zmXphZchjd6UOMX3ZN0xyZUCKugw5ZliflT6LkgbrcBXBtYD3A== +electron-osx-sign@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz#fc258c5e896859904bbe3d01da06902c04b51c3a" + integrity sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ== dependencies: - "@types/fs-extra" "^8.1.0" - bluebird-lst "^1.0.9" - builder-util "~22.4.1" - builder-util-runtime "8.6.2" - chalk "^3.0.0" - fs-extra "^8.1.0" - lazy-val "^1.0.4" - mime "^2.4.4" - -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.390: - version "1.3.397" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.397.tgz#db640c2e67b08d590a504c20b56904537aa2bafa" - integrity sha512-zcUd1p/7yzTSdWkCTrqGvbnEOASy96d0RJL/lc5BDJoO23Z3G/VHd0yIPbguDU9n8QNUTCigLO7oEdtOb7fp2A== + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^3.0.1" + +electron-publish@22.14.5: + version "22.14.5" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.14.5.tgz#34bcdce671f0e651330db20040d6919c77c94bd6" + integrity sha512-h+NANRdaA0PqGF15GKvorseWPzh1PXa/zx4I37//PIokW8eKIov8ky23foUSb55ZFWUHGpxQJux7y2NCfBtQeg== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "22.14.5" + builder-util-runtime "8.9.1" + chalk "^4.1.1" + fs-extra "^10.0.0" + lazy-val "^1.0.5" + mime "^2.5.2" + +electron-to-chromium@^1.3.896: + version "1.4.16" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.16.tgz#38ddecc616385e6f101359d1b978c802664157d2" + integrity sha512-BQb7FgYwnu6haWLU63/CdVW+9xhmHls3RCQUFiV4lvw3wimEHTVcUk2hkuZo76QhR8nnDdfZE7evJIZqijwPdA== electron-webpack-js@~2.4.1: version "2.4.1" @@ -3550,27 +3643,27 @@ electron-webpack@^2.8.2: webpack-merge "^4.2.2" yargs "^15.3.1" -electron@^7: - version "7.2.1" - resolved "https://registry.yarnpkg.com/electron/-/electron-7.2.1.tgz#e32a034b299ecee5343b3a3b98487f4f0242d86d" - integrity sha512-Y8ehT8NMR7oltzJ/j5+PD9YU8qbJsYAqiPslwPrZV+e+vl76tiIkRZy78UaJq9gin3ddzpS2Yt0rACsfgYr85w== +electron@^16: + version "16.0.4" + resolved "https://registry.yarnpkg.com/electron/-/electron-16.0.4.tgz#87dfe21d17608537fc6df292c437362297566a73" + integrity sha512-IptwmowvMP1SFOmZLh6rrURwfnOxbDBXBRBcaOdfBM5I+B9mgtdNwzNC3ymFFNzEkZUwdOyg9fu3iyjAAQIQgw== dependencies: - "@electron/get" "^1.0.1" - "@types/node" "^12.0.12" + "@electron/get" "^1.13.0" + "@types/node" "^14.6.2" extract-zip "^1.0.3" -elliptic@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" + bn.js "^4.11.9" + brorand "^1.1.0" hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" emoji-regex@^7.0.1: version "7.0.3" @@ -3582,15 +3675,10 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.0.0.tgz#48a2309cc8a1d2e9d23bc6a67c39b63032e76ea4" - integrity sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w== - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emojis-list@^3.0.0: version "3.0.0" @@ -3609,86 +3697,69 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - -enhanced-resolve@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" - integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== +enhanced-resolve@^4.1.1, enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== dependencies: graceful-fs "^4.1.2" memory-fs "^0.5.0" tapable "^1.0.0" -entities@^1.1.1, entities@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== env-paths@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" - integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" -error-ex@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.17.2: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== +es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -3704,6 +3775,11 @@ es6-error@^4.1.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-goat@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" @@ -3714,7 +3790,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -3724,106 +3800,115 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -eslint-config-airbnb-base@^14.1.0, eslint-config-airbnb-base@^14.2.0: - version "14.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4" - integrity sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== dependencies: - confusing-browser-globals "^1.0.9" - object.assign "^4.1.0" - object.entries "^1.1.2" + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" -eslint-config-airbnb-typescript@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-7.2.1.tgz#bce3f02fa894d1ec2f31ac527992e03761a9b7d4" - integrity sha512-D3elVKUbdsCfkOVstSyWuiu+KGCVTrYxJPoenPIqZtL6Li/R4xBeVTXjZIui8B8D17bDN3Pz5dSr7jRLY5HqIg== +eslint-config-airbnb-typescript@: + version "16.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-16.1.0.tgz#f75a6b4f3bb679eef34c3c930359c2ca9bc3f09c" + integrity sha512-W5Cq20KpEx5ZLC54bnVrC37zq2+WD956Kp/Ma3nYFRjT1v9KM63v+DPkrrmmrVqrlDKaD0ivm/qeYmyHV6qKlw== dependencies: - "@typescript-eslint/parser" "^2.24.0" - eslint-config-airbnb "^18.1.0" - eslint-config-airbnb-base "^14.1.0" + eslint-config-airbnb-base "^15.0.0" -eslint-config-airbnb@^18.1.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz#8a82168713effce8fc08e10896a63f1235499dcd" - integrity sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg== +eslint-config-airbnb@: + version "19.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-19.0.2.tgz#3a1681e39b68cc6abeae58300014ed5d5706b625" + integrity sha512-4v5DEMVSl043LaCT+gsxPcoiIk0iYG5zxJKKjIy80H/D//2E0vtuOBWkb0CBDxjF+y26yQzspIXYuY6wMmt9Cw== dependencies: - eslint-config-airbnb-base "^14.2.0" - object.assign "^4.1.0" - object.entries "^1.1.2" + eslint-config-airbnb-base "^15.0.0" + object.assign "^4.1.2" + object.entries "^1.1.5" -eslint-import-resolver-node@^0.3.3: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: - debug "^2.6.9" - resolve "^1.13.1" + debug "^3.2.7" + resolve "^1.20.0" -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== +eslint-module-utils@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz#b435001c9f8dd4ab7f6d0efcae4b9696d4c24b7c" + integrity sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ== dependencies: - debug "^2.6.9" + debug "^3.2.7" + find-up "^2.1.0" pkg-dir "^2.0.0" -eslint-plugin-import@^2.20.2: - version "2.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" - integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== +eslint-plugin-import@: + version "2.25.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz#a554b5f66e08fb4f6dc99221866e57cfff824766" + integrity sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg== dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" - eslint-module-utils "^2.6.0" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.1" has "^1.0.3" + is-core-module "^2.8.0" + is-glob "^4.0.3" minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" + object.values "^1.1.5" + resolve "^1.20.0" + tsconfig-paths "^3.11.0" -eslint-plugin-jsx-a11y@^6.3.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz#99ef7e97f567cc6a5b8dd5ab95a94a67058a2660" - integrity sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g== +eslint-plugin-jsx-a11y@: + version "6.5.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" + integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== dependencies: - "@babel/runtime" "^7.10.2" + "@babel/runtime" "^7.16.3" aria-query "^4.2.2" - array-includes "^3.1.1" + array-includes "^3.1.4" ast-types-flow "^0.0.7" - axe-core "^3.5.4" - axobject-query "^2.1.2" - damerau-levenshtein "^1.0.6" - emoji-regex "^9.0.0" + axe-core "^4.3.5" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.7" + emoji-regex "^9.2.2" has "^1.0.3" - jsx-ast-utils "^2.4.1" + jsx-ast-utils "^3.2.1" language-tags "^1.0.5" + minimatch "^3.0.4" -eslint-plugin-react-hooks@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-3.0.0.tgz#9e80c71846eb68dd29c3b21d832728aa66e5bd35" - integrity sha512-EjxTHxjLKIBWFgDJdhKKzLh5q+vjTFrqNZX36uIxWS4OfyXe5DawqPj3U5qeJ1ngLwatjzQnmR0Lz0J0YH3kxw== +eslint-plugin-react-hooks@: + version "4.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" + integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== -eslint-plugin-react@^7.19.0: - version "7.20.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.3.tgz#0590525e7eb83890ce71f73c2cf836284ad8c2f1" - integrity sha512-txbo090buDeyV0ugF3YMWrzLIUqpYTsWSDZV9xLSmExE1P/Kmgg9++PD931r+KEWS66O1c9R4srLVVHmeHpoAg== +eslint-plugin-react@: + version "7.27.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz#469202442506616f77a854d91babaae1ec174b45" + integrity sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA== dependencies: - array-includes "^3.1.1" - array.prototype.flatmap "^1.2.3" + array-includes "^3.1.4" + array.prototype.flatmap "^1.2.5" doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.4.1" - object.entries "^1.1.2" - object.fromentries "^2.0.2" - object.values "^1.1.1" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.0.4" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.0" + object.values "^1.1.5" prop-types "^15.7.2" - resolve "^1.17.0" - string.prototype.matchall "^4.0.2" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.6" eslint-scope@^4.0.3: version "4.0.3" @@ -3833,118 +3918,120 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== +eslint-scope@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153" + integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg== dependencies: - eslint-visitor-keys "^1.1.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" - integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: - eslint-visitor-keys "^1.1.0" + eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz#eee4acea891814cda67a7d8812d9647dd0179af2" + integrity sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA== -eslint@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== +eslint@: + version "8.4.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.4.1.tgz#d6531bbf3e598dffd7c0c7d35ec52a0b30fdfa2d" + integrity sha512-TxU/p7LB1KxQ6+7aztTnO7K0i+h0tDi81YRY9VzB6Id71kNz+fFYnf5HD5UOQmxkzcoa0TlVZf9dpMtUv0GpWg== dependencies: - "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^1.0.5" + "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.0" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.1.0" + espree "^9.2.0" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" + glob-parent "^6.0.1" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" + levn "^0.4.1" + lodash.merge "^4.6.2" minimatch "^3.0.4" - mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.3" + optionator "^0.9.1" progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" + regexpp "^3.2.0" + semver "^7.2.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== +espree@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.2.0.tgz#c50814e01611c2d0f8bd4daa83c369eabba80dbc" + integrity sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg== dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + acorn "^8.6.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^3.1.0" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.0.tgz#e5e29a6f66a837840d34f68cb9ce355260d1128b" - integrity sha512-/5qB+Mb0m2bh86tjGbA8pB0qBfdmCIK6ZNPjcw4/TtEH0+tTf0wLA5HK4KMTweSMwLGHwBDWCBV+6+2+EuHmgg== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: - estraverse "^5.0.0" + estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" - integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" @@ -3957,19 +4044,19 @@ etag@~1.8.1: integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" - integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== eventsource@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" - integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== dependencies: original "^1.0.0" @@ -3981,32 +4068,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" - integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -4091,15 +4152,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -4124,22 +4176,33 @@ extract-zip@^1.0.3: mkdirp "^0.5.4" yauzl "^2.10.0" -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== -fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -4151,17 +4214,17 @@ fast-url-parser@1.1.3: dependencies: punycode "^1.3.2" -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: - websocket-driver ">=0.5.1" + reusify "^1.0.4" -faye-websocket@~0.11.1: - version "0.11.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" - integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" @@ -4177,33 +4240,33 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" file-loader@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f" - integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== dependencies: loader-utils "^2.0.0" - schema-utils "^2.6.5" + schema-utils "^3.0.0" file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filelist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" + integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== + dependencies: + minimatch "^3.0.4" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -4214,6 +4277,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -4236,16 +4306,16 @@ find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-cache-dir@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -4267,7 +4337,7 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -findup-sync@3.0.0: +findup-sync@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== @@ -4277,24 +4347,18 @@ findup-sync@3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + flatted "^3.1.0" + rimraf "^3.0.2" -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== +flatted@^3.1.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== flush-write-stream@^1.0.0: version "1.1.1" @@ -4305,21 +4369,28 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb" - integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA== - dependencies: - debug "^3.0.0" + version "1.14.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.6.tgz#8cfb281bbc035b3c067d6cd975b0f6ade6e855cd" + integrity sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A== for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fragment-cache@^0.2.1: version "0.2.1" @@ -4341,6 +4412,15 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -4350,15 +4430,15 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" graceful-fs "^4.2.0" jsonfile "^6.0.1" - universalify "^1.0.0" + universalify "^2.0.0" fs-minipass@^2.0.0: version "2.1.0" @@ -4388,13 +4468,18 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.12" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" - integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" nan "^2.12.1" +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -4405,25 +4490,24 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" @@ -4433,12 +4517,20 @@ get-stream@^4.0.0, get-stream@^4.1.0: pump "^3.0.0" get-stream@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -4452,17 +4544,24 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -4471,32 +4570,24 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -global-agent@^2.0.2: - version "2.1.8" - resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.8.tgz#99d153662b2c04cbc1199ffbc081a3aa656ac50f" - integrity sha512-VpBe/rhY6Rw2VDOTszAMNambg+4Qv8j0yiTNDYEXXXxkUNGWLHp8A3ztK4YDBbFNcWF4rgsec6/5gPyryya/+A== +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== dependencies: - boolean "^3.0.0" - core-js "^3.6.4" + boolean "^3.0.1" es6-error "^4.1.1" - matcher "^2.1.0" - roarr "^2.15.2" - semver "^7.1.2" - serialize-error "^5.0.0" - -global-dirs@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" - integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== - dependencies: - ini "^1.3.5" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" -global-modules@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== dependencies: - global-prefix "^3.0.0" + ini "2.0.0" global-modules@^1.0.0: version "1.0.0" @@ -4507,6 +4598,13 @@ global-modules@^1.0.0: is-windows "^1.0.1" resolve-dir "^1.0.0" +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" @@ -4550,20 +4648,32 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.6.0, globals@^13.9.0: + version "13.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" + integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" globalthis@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" - integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b" + integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ== dependencies: define-properties "^1.1.3" +globby@^11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -4592,15 +4702,15 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.9, graceful-fs@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= graphlib@^2.1.8: version "2.1.8" @@ -4614,29 +4724,10 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -handlebars@^4.7.6: - version "4.7.6" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" - integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== has-flag@^3.0.0: version "3.0.0" @@ -4648,10 +4739,17 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" has-value@^0.3.1: version "0.3.1" @@ -4689,7 +4787,7 @@ has-yarn@^2.1.0: resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== -has@^1.0.1, has@^1.0.3: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -4697,12 +4795,13 @@ has@^1.0.1, has@^1.0.3: function-bind "^1.1.1" hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" @@ -4718,16 +4817,11 @@ he@^1.2.0: integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== heap@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" - integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= - -highlight.js@^10.0.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.1.1.tgz#691a2148a8d922bf12e52a294566a0d993b94c57" - integrity sha512-b4L09127uVa+9vkMgPpdUQP78ickGbHEQTWeBrQFTJZ4/n2aihWOGS0ZoUqAwjVmfjhq/C76HRzkqwZhK4sBbg== + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -4750,17 +4844,12 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== - -hosted-git-info@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.4.tgz#be4973eb1fd2737b11c9c7c19380739bb249f60d" - integrity sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ== +hosted-git-info@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== dependencies: - lru-cache "^5.1.1" + lru-cache "^6.0.0" hpack.js@^2.1.6: version "2.1.6" @@ -4772,42 +4861,25 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - -html-entities@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= - -html-loader@1.0.0-alpha.0: - version "1.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-1.0.0-alpha.0.tgz#3f4ae7b490a587619be6d1eaa8ce16683580c642" - integrity sha512-KcuaIRWTU0kFjOJCs32a3JsGNCWkeOak0/F/uvJNp3x/N4McXdqHpcK64cYTozK7QLPKKtUqb9h7wR9K9rYRkg== - dependencies: - "@posthtml/esm" "^1.0.0" - htmlnano "^0.1.6" - loader-utils "^1.1.0" - posthtml "^0.11.2" - schema-utils "^0.4.3" +html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== -html-loader@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-1.1.0.tgz#91915f4d274caa9d46d1c3dc847cd82bfc037dbd" - integrity sha512-zwLbEgy+i7sgIYTlxI9M7jwkn29IvdsV6f1y7a2aLv/w8l1RigVk0PFijBZLLFsdi2gvL8sf2VJhTjLlfnK8sA== +html-loader@^1, html-loader@^1.1.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-1.3.2.tgz#5a72ebba420d337083497c9aba7866c9e1aee340" + integrity sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA== dependencies: - html-minifier-terser "^5.0.5" + html-minifier-terser "^5.1.1" htmlparser2 "^4.1.0" loader-utils "^2.0.0" - parse-srcset "^1.0.2" - schema-utils "^2.6.5" + schema-utils "^3.0.0" -html-minifier-terser@^5.0.1, html-minifier-terser@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.5.tgz#8f12f639789f04faa9f5cf2ff9b9f65607f21f8b" - integrity sha512-cBSFFghQh/uHcfSiL42KxxIRMF7A144+3E44xdlctIjxEmkEfCvouxNyFH2wysXk1fCGBPwtcr3hDWlGTfkDew== +html-minifier-terser@^5.0.1, html-minifier-terser@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== dependencies: camel-case "^4.1.1" clean-css "^4.2.3" @@ -4818,44 +4890,20 @@ html-minifier-terser@^5.0.1, html-minifier-terser@^5.0.5: terser "^4.6.3" html-webpack-plugin@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.4.tgz#90cdfb168094e93e047174d9baca098ec5540636" - integrity sha512-BREQzUbFfIQS39KqxkT2L1Ot0tuu1isako1CaCQLrgEQ43zi2ScHAe3SMTnVBWsStnIsGtl8jprDdxwZkNhrwQ== + version "4.5.2" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12" + integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A== dependencies: "@types/html-minifier-terser" "^5.0.0" "@types/tapable" "^1.0.5" "@types/webpack" "^4.41.8" html-minifier-terser "^5.0.1" loader-utils "^1.2.3" - lodash "^4.17.15" + lodash "^4.17.20" pretty-error "^2.1.1" tapable "^1.1.3" util.promisify "1.0.0" -htmlnano@^0.1.6: - version "0.1.10" - resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-0.1.10.tgz#a0a548eb4c76ae2cf2423ec7a25c881734d3dea6" - integrity sha512-eTEUzz8VdWYp+w/KUdb99kwao4reR64epUySyZkQeepcyzPQ2n2EPWzibf6QDxmkGy10Kr+CKxYqI3izSbmhJQ== - dependencies: - cssnano "^3.4.0" - object-assign "^4.0.1" - posthtml "^0.11.3" - posthtml-render "^1.1.4" - svgo "^1.0.5" - terser "^3.8.1" - -htmlparser2@^3.3.0, htmlparser2@^3.9.2: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - htmlparser2@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78" @@ -4866,6 +4914,16 @@ htmlparser2@^4.1.0: domutils "^2.0.0" entities "^2.0.0" +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -4908,10 +4966,10 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -"http-parser-js@>=0.4.0 <0.4.11": - version "0.4.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" - integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= +http-parser-js@>=0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" + integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== http-proxy-middleware@0.19.1: version "0.19.1" @@ -4924,9 +4982,9 @@ http-proxy-middleware@0.19.1: micromatch "^3.1.10" http-proxy@^1.17.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" - integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" follow-redirects "^1.0.0" @@ -4937,19 +4995,27 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.1.tgz#b2425d3c7b18f7219f2ca663d103bddb91718d64" - integrity sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q== +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: - safer-buffer ">= 2.1.2 < 3" + safer-buffer ">= 2.1.2 < 3.0.0" icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" @@ -4958,10 +5024,15 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.13, ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== iferr@^0.1.5: version "0.1.5" @@ -4973,20 +5044,25 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.4, ignore@^5.1.8: + version "5.1.9" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" + integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= -immutable@^4.0.0-rc.12: - version "4.0.0-rc.12" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217" - integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A== +immutable@: + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== -import-fresh@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -4996,7 +5072,7 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= -import-local@2.0.0, import-local@^2.0.0: +import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== @@ -5014,11 +5090,6 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -5032,7 +5103,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5047,29 +5118,15 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -inquirer@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" - integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^3.0.0" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== internal-ip@^4.3.0: version "4.3.0" @@ -5079,37 +5136,20 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" -internal-slot@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" - integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - es-abstract "^1.17.0-next.1" + get-intrinsic "^1.1.0" has "^1.0.3" - side-channel "^1.0.2" - -interpret@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + side-channel "^1.0.4" -interpret@^1.0.0: +interpret@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -invariant@^2.2.2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" @@ -5125,11 +5165,6 @@ ipaddr.js@1.9.1, ipaddr.js@^1.9.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - is-absolute-url@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" @@ -5150,14 +5185,19 @@ is-accessor-descriptor@^1.0.0: kind-of "^6.0.0" is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" is-binary-path@^1.0.0: version "1.0.1" @@ -5166,15 +5206,30 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-ci@^2.0.0: version "2.0.0" @@ -5183,6 +5238,20 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.2.0, is-core-module@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -5198,9 +5267,11 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" is-descriptor@^0.1.0: version "0.1.6" @@ -5220,6 +5291,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -5237,13 +5313,6 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -5261,25 +5330,37 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-installed-globally@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" + global-dirs "^3.0.0" + is-path-inside "^3.0.2" -is-npm@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" - integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== +is-negative-zero@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" @@ -5288,6 +5369,11 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" @@ -5312,10 +5398,10 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-path-inside@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^1.0.0: version "1.1.0" @@ -5329,54 +5415,50 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-regex@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== +is-regex@^1.0.4, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: - has "^1.0.3" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -is-regex@^1.0.5, is-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" - integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== - dependencies: - has-symbols "^1.0.1" +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - integrity sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk= +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: - html-comment-regex "^1.1.0" + has-tostringtag "^1.0.0" -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -5387,6 +5469,13 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + is-yarn-global@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" @@ -5397,10 +5486,17 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isbinaryfile@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b" - integrity sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg== +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isbinaryfile@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== isexe@^2.0.0: version "2.0.0" @@ -5419,23 +5515,28 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -jest-worker@^25.1.0: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.6.tgz#d1292625326794ce187c38f51109faced3846c58" - integrity sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA== +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jest-worker@^25.4.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" "jquery@^1.4 || ^2.0 || ^3.0": - version "3.5.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" - integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== - -js-base64@^2.1.9: - version "2.5.2" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209" - integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ== + version "3.6.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" + integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -5443,47 +5544,46 @@ js-base64@^2.1.9: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - integrity sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A= +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: - argparse "^1.0.7" - esprima "^2.6.0" + argparse "^2.0.1" -js2xmlparser@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.1.tgz#670ef71bc5661f089cc90481b99a05a1227ae3bd" - integrity sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw== +js2xmlparser@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" + integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA== dependencies: - xmlcreate "^2.0.3" + xmlcreate "^2.0.4" -jsdoc@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.3.tgz#dccea97d0e62d63d306b8b3ed1527173b5e2190d" - integrity sha512-Yf1ZKA3r9nvtMWHO1kEuMZTlHOF8uoQ0vyo5eH7SQy5YeIiHM+B0DgKnn+X6y6KDYZcF7G2SPkKF+JORCXWE/A== +jsdoc@: + version "3.6.7" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.7.tgz#00431e376bed7f9de4716c6f15caa80e64492b89" + integrity sha512-sxKt7h0vzCd+3Y81Ey2qinupL6DpRSZJclS04ugHDNmRUXGzqicMJ6iwayhSA0S0DwwX30c5ozyUthr1QKF6uw== dependencies: - "@babel/parser" "^7.4.4" - bluebird "^3.5.4" - catharsis "^0.8.11" + "@babel/parser" "^7.9.4" + bluebird "^3.7.2" + catharsis "^0.9.0" escape-string-regexp "^2.0.0" - js2xmlparser "^4.0.0" + js2xmlparser "^4.0.1" klaw "^3.0.0" - markdown-it "^8.4.2" - markdown-it-anchor "^5.0.2" - marked "^0.7.0" - mkdirp "^0.5.1" + markdown-it "^10.0.0" + markdown-it-anchor "^5.2.7" + marked "^2.0.3" + mkdirp "^1.0.4" requizzle "^0.2.3" - strip-json-comments "^3.0.1" + strip-json-comments "^3.1.0" taffydb "2.6.2" - underscore "~1.9.1" + underscore "~1.13.1" jsesc@^2.5.1: version "2.5.2" @@ -5520,7 +5620,7 @@ json-stringify-safe@^5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json3@^3.3.2: +json3@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== @@ -5532,13 +5632,18 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0, json5@^2.1.1, json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== +json5@^2.1.0, json5@^2.1.2, json5@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" +jsonc-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -5547,26 +5652,26 @@ jsonfile@^4.0.0: graceful-fs "^4.1.6" jsonfile@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" - integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: - universalify "^1.0.0" + universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" -jsx-ast-utils@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" - integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" + integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== dependencies: - array-includes "^3.1.1" - object.assign "^4.1.0" + array-includes "^3.1.3" + object.assign "^4.1.2" jszip@^3.1.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.5.0.tgz#b4fd1f368245346658e781fec9675802489e15f6" - integrity sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA== + version "3.7.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.7.1.tgz#bd63401221c15625a1228c556ca8a68da6fda3d9" + integrity sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg== dependencies: lie "~3.3.0" pako "~1.0.2" @@ -5622,9 +5727,9 @@ klayjs@^0.4.1: integrity sha1-W/n63Ho+RLlAgrulAefYAwdtz8I= language-subtag-registry@~0.3.2: - version "0.3.20" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz#a00a37121894f224f763268e431c55556b0c0755" - integrity sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg== + version "0.3.21" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== language-tags@^1.0.5: version "1.0.5" @@ -5633,7 +5738,7 @@ language-tags@^1.0.5: dependencies: language-subtag-registry "~0.3.2" -latest-version@^5.0.0: +latest-version@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== @@ -5645,37 +5750,18 @@ layout-base@^1.0.0: resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== -lazy-val@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65" - integrity sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q== - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levenary@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" - integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== - dependencies: - leven "^3.1.0" +lazy-val@^1.0.4, lazy-val@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" + prelude-ls "^1.2.1" + type-check "~0.4.0" lie@~3.3.0: version "3.3.0" @@ -5691,30 +5777,11 @@ linkify-it@^2.0.0: dependencies: uc.micro "^1.0.1" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" @@ -5725,9 +5792,9 @@ loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: json5 "^1.0.1" loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" @@ -5761,39 +5828,34 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.1.2, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@^4.2.0: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.2.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -loglevel@^1.6.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" - integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== +loglevel@^1.6.8: + version "1.8.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" + integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.0, loose-envify@^1.4.0: +loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" -lower-case@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" - integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: - tslib "^1.10.0" + tslib "^2.0.3" lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" @@ -5805,14 +5867,6 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -5820,10 +5874,17 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lunr@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" - integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" @@ -5833,20 +5894,13 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" - integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -5859,43 +5913,38 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-it-anchor@^5.0.2: - version "5.2.7" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.2.7.tgz#ec740f6bd03258a582cd0c65b9644b9f9852e5a3" - integrity sha512-REFmIaSS6szaD1bye80DMbp7ePwsPNvLTR5HunsUcZ0SG0rWJQ+Pz24R4UlTKtjKBPhxo0v0tOBDYjZQQknW8Q== +markdown-it-anchor@^5.2.7: + version "5.3.0" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz#d549acd64856a8ecd1bea58365ef385effbac744" + integrity sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA== -markdown-it@^8.4.2: - version "8.4.2" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" - integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== +markdown-it@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" + integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg== dependencies: argparse "^1.0.7" - entities "~1.1.1" + entities "~2.0.0" linkify-it "^2.0.0" mdurl "^1.0.1" uc.micro "^1.0.5" -marked@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-1.0.0.tgz#d35784245a04871e5988a491e28867362e941693" - integrity sha512-Wo+L1pWTVibfrSr+TTtMuiMfNzmZWiOPeO7rZsQUY5bgsxpHesBEcIWJloWVTFnrMXnf/TL30eTFSGJddmQAng== +marked@^2.0.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/marked/-/marked-2.1.3.tgz#bd017cef6431724fd4b27e0657f5ceb14bff3753" + integrity sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA== -marked@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" - integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== +marked@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/marked/-/marked-3.0.8.tgz#2785f0dc79cbdc6034be4bb4f0f0a396bd3f8aeb" + integrity sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw== -matcher@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-2.1.0.tgz#64e1041c15b993e23b786f93320a7474bf833c28" - integrity sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ== +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== dependencies: - escape-string-regexp "^2.0.0" - -math-expression-evaluator@^1.2.14: - version "1.2.22" - resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz#c14dcb3d8b4d150e5dcea9c68c8dad80309b0d5e" - integrity sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ== + escape-string-regexp "^4.0.0" md5.js@^1.3.4: version "1.3.5" @@ -5906,16 +5955,6 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - -mdn-data@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" - integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== - mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -5926,21 +5965,12 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - "memoize-one@>=3.1.1 <6": - version "5.1.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0" - integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA== + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== -memory-fs@^0.4.0, memory-fs@^0.4.1: +memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= @@ -5966,6 +5996,11 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5990,6 +6025,14 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -5998,10 +6041,10 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== +mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-db@~1.33.0: version "1.33.0" @@ -6015,27 +6058,22 @@ mime-types@2.1.18: dependencies: mime-db "~1.33.0" -mime-types@^2.1.26, mime-types@~2.1.17, mime-types@~2.1.24: - version "2.1.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: - mime-db "1.43.0" + mime-db "1.51.0" mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== - -mimic-fn@^2.0.0, mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mime@^2.4.4, mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" @@ -6064,12 +6102,12 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -6096,16 +6134,16 @@ minipass-flush@^1.0.5: minipass "^3.0.0" minipass-pipeline@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" - integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== dependencies: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" - integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + version "3.1.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" + integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== dependencies: yallist "^4.0.0" @@ -6133,13 +6171,18 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.1: +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -6162,11 +6205,16 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" @@ -6180,15 +6228,20 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +nan@2.14.2: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + +nanoid@^3.1.30: + version "3.1.30" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" + integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== nanomatch@^1.2.9: version "1.2.13" @@ -6217,33 +6270,38 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -no-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" - integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: - lower-case "^2.0.1" - tslib "^1.10.0" + lower-case "^2.0.2" + tslib "^2.0.3" -node-forge@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" - integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== -node-gyp-build@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.1.tgz#f28f0d3d3ab268d48ab76c6f446f19bc3d0db9dc" - integrity sha512-XyCKXsqZfLqHep1hhsMncoXuUNt/cXCjg1+8CLbu69V1TKuPiOeSGbL9n+k/ByKH8UT0p4rdIX8XkTRZV0i7Sw== +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-gyp-build@^4.2.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== node-libs-browser@^2.2.1: version "2.2.1" @@ -6279,20 +6337,10 @@ node-loader@^0.6.0: resolved "https://registry.yarnpkg.com/node-loader/-/node-loader-0.6.0.tgz#c797ef51095ed5859902b157f6384f6361e05ae8" integrity sha1-x5fvUQle1YWZArFX9jhPY2HgWug= -node-releases@^1.1.53: - version "1.1.53" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" - integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== - -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== normalize-path@^2.1.1: version "2.1.1" @@ -6301,17 +6349,12 @@ normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@1.9.1, normalize-url@^1.4.0, normalize-url@^1.9.1: +normalize-url@1.9.1, normalize-url@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= @@ -6322,9 +6365,9 @@ normalize-url@1.9.1, normalize-url@^1.4.0, normalize-url@^1.9.1: sort-keys "^1.0.0" normalize-url@^4.1.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" - integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== npm-conf@^1.1.3: version "1.1.3" @@ -6341,22 +6384,12 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -nth-check@^1.0.2, nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== +nth-check@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== dependencies: - boolbase "~1.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + boolbase "^1.0.0" object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" @@ -6372,17 +6405,20 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.1.tgz#d4bd7d7de54b9a75599f59a00bd698c1f1c6549b" + integrity sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA== object-is@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" - integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -6392,44 +6428,52 @@ object-visit@^1.0.0: resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: - isobject "^3.0.0" + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" -object.entries@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" - integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" - has "^1.0.3" + es-abstract "^1.19.1" -object.fromentries@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== +object.getownpropertydescriptors@^2.0.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" + es-abstract "^1.19.1" -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== +object.hasown@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" + integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.19.1" object.pick@^1.3.0: version "1.3.0" @@ -6438,15 +6482,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" + es-abstract "^1.19.1" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -6472,13 +6515,6 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - opn@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" @@ -6486,17 +6522,17 @@ opn@^5.5.0: dependencies: is-wsl "^1.1.0" -optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" original@^1.0.0: version "1.0.2" @@ -6510,40 +6546,16 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-locale@^3.0.0, os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -6551,7 +6563,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -6633,12 +6645,12 @@ parallel-transform@^1.1.0: readable-stream "^2.1.5" param-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238" - integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: - dot-case "^3.0.3" - tslib "^1.10.0" + dot-case "^3.0.4" + tslib "^2.0.3" parent-module@^1.0.0: version "1.0.1" @@ -6647,47 +6659,34 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== dependencies: - asn1.js "^4.0.0" + asn1.js "^5.2.0" browserify-aes "^1.0.0" - create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" safe-buffer "^5.1.1" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= -parse-srcset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" - integrity sha1-8r0iH2zJcKk42IVWq8WJyqqiveE= - parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascal-case@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" - integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: - no-case "^3.0.3" - tslib "^1.10.0" + no-case "^3.0.4" + tslib "^2.0.3" pascalcase@^0.1.1: version "0.1.1" @@ -6729,10 +6728,15 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" @@ -6744,17 +6748,15 @@ path-to-regexp@2.2.1: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -6767,6 +6769,21 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -6815,170 +6832,28 @@ pkg-dir@^4.1.0: dependencies: find-up "^4.0.0" -pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" - integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= +plist@^3.0.1, plist@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.4.tgz#a62df837e3aed2bb3b735899d510c4f186019cbe" + integrity sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg== dependencies: - find-up "^2.1.0" - -popper.js@^1.0.0, popper.js@^1.16.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + base64-js "^1.5.1" + xmlbuilder "^9.0.7" -portfinder@^1.0.25: - version "1.0.25" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" - integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== +portfinder@^1.0.26: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== dependencies: async "^2.6.2" debug "^3.1.1" - mkdirp "^0.5.1" + mkdirp "^0.5.5" posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - integrity sha1-d7rnypKK2FcW4v2kLyYb98HWW14= - dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" - -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - integrity sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks= - dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" - -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - integrity sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0= - dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" - -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - integrity sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0= - dependencies: - postcss "^5.0.14" - -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - integrity sha1-uavye4isGIFYpesSq8riAmO5GTI= - dependencies: - postcss "^5.0.4" - -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - integrity sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU= - dependencies: - postcss "^5.0.14" - -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - integrity sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg= - dependencies: - postcss "^5.0.16" - -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - integrity sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM= - dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" - -postcss-filter-plugins@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" - integrity sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ== - dependencies: - postcss "^5.0.4" - -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - integrity sha1-TFUwMTwI4dWzu/PSu8dH4njuonA= - dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" - -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - integrity sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg= - dependencies: - postcss "^5.0.4" - -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - integrity sha1-0d9d+qexrMO+VT8OnhDofGG19yE= - dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" - vendors "^1.0.0" - -postcss-message-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4= - -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - integrity sha1-S1jttWZB66fIR0qzUmyv17vey2k= - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - integrity sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE= - dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" - -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - integrity sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM= - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" - -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - integrity sha1-ssapjAByz5G5MtGkllCBFDEXNb8= - dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" - postcss-modules-extract-imports@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" @@ -6986,17 +6861,31 @@ postcss-modules-extract-imports@^2.0.0: dependencies: postcss "^7.0.5" +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + postcss-modules-local-by-default@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" - integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== dependencies: icss-utils "^4.1.1" - postcss "^7.0.16" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.0" + postcss-value-parser "^4.1.0" -postcss-modules-scope@^2.1.1: +postcss-modules-scope@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== @@ -7004,6 +6893,13 @@ postcss-modules-scope@^2.1.1: postcss "^7.0.6" postcss-selector-parser "^6.0.0" +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + postcss-modules-values@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" @@ -7012,154 +6908,47 @@ postcss-modules-values@^3.0.0: icss-utils "^4.0.0" postcss "^7.0.6" -postcss-normalize-charset@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" - integrity sha1-757nEhLX/nWceO0WL2HtYrXLk/E= - dependencies: - postcss "^5.0.5" - -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - integrity sha1-EI90s/L82viRov+j6kWSJ5/HgiI= - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" - integrity sha1-7sbCpntsQSqNsgQud/6NpD+VwR0= - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" - -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" - integrity sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM= - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" - integrity sha1-aPgGlfBF0IJjqHmtJA343WT2ROo= - dependencies: - postcss "^5.0.4" - -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" - integrity sha1-/3b02CEkN7McKYpC0uFEQCV3GuE= - dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" - -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" - integrity sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A= +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" + icss-utils "^5.0.0" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.7" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz#48404830a635113a71fd79397de8209ed05a66fc" + integrity sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA== dependencies: cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - integrity sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0= - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" - -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - integrity sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0= - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" - integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== + util-deprecate "^1.0.2" -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - integrity sha1-0hCd3AVbka9n/EyzsCWUZjnSryI= - dependencies: - has "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" +postcss-value-parser@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.23, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" - integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== +postcss@^7.0.14, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== dependencies: - chalk "^2.4.2" + picocolors "^0.2.1" source-map "^0.6.1" - supports-color "^6.1.0" -posthtml-parser@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.4.2.tgz#a132bbdf0cd4bc199d34f322f5c1599385d7c6c1" - integrity sha512-BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg== +postcss@^8.2.15: + version "8.4.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" + integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== dependencies: - htmlparser2 "^3.9.2" + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" -posthtml-render@^1.1.4, posthtml-render@^1.1.5: - version "1.2.0" - resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.2.0.tgz#3df0c800a8bbb95af583a94748520469477addf4" - integrity sha512-dQB+hoAKDtnI94RZm/wxBUH9My8OJcXd0uhWmGh2c7tVtQ85A+OS3yCN3LNbFtPz3bViwBJXAeoi+CBGMXM0DA== - -posthtml@^0.11.2, posthtml@^0.11.3: - version "0.11.6" - resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.11.6.tgz#e349d51af7929d0683b9d8c3abd8166beecc90a8" - integrity sha512-C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw== - dependencies: - posthtml-parser "^0.4.1" - posthtml-render "^1.1.5" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prepend-http@^1.0.0: version "1.0.4" @@ -7172,17 +6961,12 @@ prepend-http@^2.0.0: integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= pretty-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" - integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + version "2.1.2" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== dependencies: - renderkid "^2.0.1" - utila "~0.4" - -private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + lodash "^4.17.20" + renderkid "^2.0.4" process-nextick-args@~2.0.0: version "2.0.1" @@ -7219,11 +7003,11 @@ proto-list@~1.2.1: integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - forwarded "~0.1.2" + forwarded "0.2.0" ipaddr.js "1.9.1" prr@~1.0.1: @@ -7231,11 +7015,6 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -7288,18 +7067,13 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -pupa@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" - integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== dependencies: escape-goat "^2.0.0" -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" @@ -7324,11 +7098,16 @@ querystring@0.2.0: integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= querystringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" - integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -7373,7 +7152,7 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-cytoscapejs@^1.2.1: +react-cytoscapejs@: version "1.2.1" resolved "https://registry.yarnpkg.com/react-cytoscapejs/-/react-cytoscapejs-1.2.1.tgz#ccce46acabf4f0c41dce9070743854f92b0dc050" integrity sha512-8exVCetpzyGCAKuRjXPWGjFCnb22boZ3SXUPpPB/+wQI8Q8BwkT1URN3A7J1Czvj1qAbShh5QQ514mBUp7i7kw== @@ -7381,22 +7160,22 @@ react-cytoscapejs@^1.2.1: cytoscape "^3.2.19" prop-types "^15.6.2" -react-dom@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" - integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== +react-dom@^16: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" scheduler "^0.19.1" -react-draggable@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.2.0.tgz#40cc5209082ca7d613104bf6daf31372cc0e1114" - integrity sha512-5wFq//gEoeTYprnd4ze8GrFc+Rbnx+9RkOMR3vk4EbWxj02U6L6T3yrlKeiw4X5CtjD2ma2+b3WujghcXNRzkw== +react-draggable@^4.4.4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.4.tgz#5b26d9996be63d32d285a426f41055de87e59b2f" + integrity sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA== dependencies: - classnames "^2.2.5" + clsx "^1.1.1" prop-types "^15.6.0" react-fast-compare@^3.2.0: @@ -7404,10 +7183,10 @@ react-fast-compare@^3.2.0: resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== -react-hot-loader@^4.12.20: - version "4.12.20" - resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.12.20.tgz#c2c42362a7578e5c30357a5ff7afa680aa0bef8a" - integrity sha512-lPlv1HVizi0lsi+UFACBJaydtRYILWkfHAC/lyCs6ZlAxlOZRQIfYHDqiGaRvL/GF7zyti+Qn9XpnDAUvdFA4A== +react-hot-loader@^4: + version "4.13.0" + resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.13.0.tgz#c27e9408581c2a678f5316e69c061b226dc6a202" + integrity sha512-JrLlvUPqh6wIkrK2hZDfOyq/Uh/WeVEr8nc7hkn2/3Ul0sx1Kr5y4kOGNacNRoj7RhwLNcQ3Udf1KJXrqc0ZtA== dependencies: fast-levenshtein "^2.0.6" global "^4.3.0" @@ -7428,19 +7207,19 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-virtualized@^9.21.2: - version "9.21.2" - resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.21.2.tgz#02e6df65c1e020c8dbf574ec4ce971652afca84e" - integrity sha512-oX7I7KYiUM7lVXQzmhtF4Xg/4UA5duSA+/ZcAvdWlTLFCoFYq1SbauJT5gZK9cZS/wdYR6TPGpX/dqzvTqQeBA== +react-virtualized@^9.22.3: + version "9.22.3" + resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.3.tgz#f430f16beb0a42db420dbd4d340403c0de334421" + integrity sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw== dependencies: - babel-runtime "^6.26.0" - clsx "^1.0.1" - dom-helpers "^5.0.0" - loose-envify "^1.3.0" - prop-types "^15.6.0" + "@babel/runtime" "^7.7.2" + clsx "^1.0.4" + dom-helpers "^5.1.3" + loose-envify "^1.4.0" + prop-types "^15.7.2" react-lifecycles-compat "^3.0.4" -react-window@^1.8.6: +react-window@: version "1.8.6" resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.6.tgz#d011950ac643a994118632665aad0c6382e2a112" integrity sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg== @@ -7448,25 +7227,24 @@ react-window@^1.8.6: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" -react@^16.8: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" - integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== +react@^16: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" -read-config-file@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-5.0.2.tgz#55e005e5a447a9ce5806358d7b22cb7cefb6436d" - integrity sha512-tVt1lsiSjs+FtL/vtfCivqtKR1UNk3BB3uPJQvJqkgtAYDvZjo0xyXFYSVmzaTcO+Jdi5G7O2K2vDV+p1M/oug== +read-config-file@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade" + integrity sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg== dependencies: - dotenv "^8.2.0" + dotenv "^9.0.2" dotenv-expand "^5.1.0" - fs-extra "^8.1.0" - js-yaml "^3.13.1" - json5 "^2.1.1" + js-yaml "^4.1.0" + json5 "^2.2.0" lazy-val "^1.0.4" read-config-file@~4.0.1: @@ -7483,23 +7261,6 @@ read-config-file@~4.0.1: json5 "^2.1.0" lazy-val "^1.0.4" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -7513,7 +7274,7 @@ read-pkg@^2.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1: +readable-stream@^3.0.6, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -7531,58 +7292,36 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - -reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= - dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" - -reduce-function-call@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.3.tgz#60350f7fb252c0a67eb10fd4694d16909971300f" - integrity sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: - balanced-match "^1.0.0" + picomatch "^2.2.1" -regenerate-unicode-properties@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" - integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== dependencies: - regenerate "^1.4.0" + regenerate "^1.4.2" -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.14.2: - version "0.14.4" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" - integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== dependencies: "@babel/runtime" "^7.8.4" - private "^0.1.8" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -7592,35 +7331,30 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpp@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" - integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== +regexpu-core@^4.7.1: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.2.0" - regjsgen "^0.5.1" - regjsparser "^0.6.4" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.2.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" registry-auth-token@3.3.2: version "3.3.2" @@ -7631,9 +7365,9 @@ registry-auth-token@3.3.2: safe-buffer "^5.0.1" registry-auth-token@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479" - integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== dependencies: rc "^1.2.8" @@ -7651,15 +7385,15 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" -regjsgen@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== -regjsparser@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" - integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== dependencies: jsesc "~0.5.0" @@ -7673,21 +7407,21 @@ remove-trailing-separator@^1.0.1: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= -renderkid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" - integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== +renderkid@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== dependencies: - css-select "^1.1.0" - dom-converter "^0.2" - htmlparser2 "^3.3.0" - strip-ansi "^3.0.0" - utila "^0.4.0" + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.6.1: version "1.6.1" @@ -7699,11 +7433,6 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -7751,18 +7480,20 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== +resolve@^1.14.2, resolve@^1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: + is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^1.3.2, resolve@^1.8.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== dependencies: + is-core-module "^2.2.0" path-parse "^1.0.6" responselike@^1.0.2: @@ -7772,14 +7503,6 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -7790,12 +7513,10 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" @@ -7804,7 +7525,7 @@ rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: dependencies: glob "^7.1.3" -rimraf@^3.0.2: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -7819,24 +7540,24 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -roarr@^2.15.2: - version "2.15.3" - resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.3.tgz#65248a291a15af3ebfd767cbf7e44cb402d1d836" - integrity sha512-AEjYvmAhlyxOeB9OqPUzQCo3kuAkNfuDk/HqWbZdFsqDFpapkTjiw+p4svNEoRLvuqNTxqfL+s+gtD4eDgZ+CA== +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== dependencies: - boolean "^3.0.0" + boolean "^3.0.1" detect-node "^2.0.4" globalthis "^1.0.1" json-stringify-safe "^5.0.1" semver-compare "^1.0.0" sprintf-js "^1.1.2" -run-async@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" - integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: - is-promise "^2.1.0" + queue-microtask "^1.2.2" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -7845,22 +7566,15 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.5.3: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== - dependencies: - tslib "^1.9.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex@^1.1.0: version "1.1.0" @@ -7869,24 +7583,24 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sanitize-filename@^1.6.2, sanitize-filename@^1.6.3: +sanitize-filename@^1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== dependencies: truncate-utf8-bytes "^1.0.0" -sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: +sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.19.0, scheduler@^0.19.1: +scheduler@^0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== @@ -7894,14 +7608,6 @@ scheduler@^0.19.0, scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@^0.4.3: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -7911,25 +7617,35 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.6.0, schema-utils@^2.6.4, schema-utils@^2.6.5: - version "2.6.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" - integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== +schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: - ajv "^6.12.0" - ajv-keywords "^3.4.1" + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selfsigned@^1.10.7: - version "1.10.7" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" - integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== +selfsigned@^1.10.8: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== dependencies: - node-forge "0.9.0" + node-forge "^0.10.0" semver-compare@^1.0.0: version "1.0.0" @@ -7943,30 +7659,27 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: +semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.1.1, semver@^7.2.1: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -semver@^7.1.2, semver@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6" - integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA== +semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" send@0.17.1: version "0.17.1" @@ -7987,22 +7700,24 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -serialize-error@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-5.0.0.tgz#a7ebbcdb03a5d71a6ed8461ffe0fc1a1afed62ac" - integrity sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA== +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== dependencies: - type-fest "^0.8.0" + type-fest "^0.13.1" -serialize-javascript@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" - integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" -serve-handler@6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.2.tgz#f05b0421a313fff2d257838cba00cbcc512cd2b6" - integrity sha512-RFh49wX7zJmmOVDcIjiDSJnMH+ItQEvyuYLYuDBVoA/xmQSCuj+uRmk1cmBB5QQlI3qOiWKp6p4DUGY+Z5AB2A== +serve-handler@6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" + integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== dependencies: bytes "3.0.0" content-disposition "0.5.2" @@ -8036,19 +7751,19 @@ serve-static@1.14.1: parseurl "~1.3.3" send "0.17.1" -serve@^11.3.0: - version "11.3.0" - resolved "https://registry.yarnpkg.com/serve/-/serve-11.3.0.tgz#1d342e13e310501ecf17b6602f1f35da640d6448" - integrity sha512-AU0g50Q1y5EVFX56bl0YX5OtVjUX1N737/Htj93dQGKuHiuLvVB45PD8Muar70W6Kpdlz8aNJfoUqTyAq9EE/A== +serve@: + version "13.0.2" + resolved "https://registry.yarnpkg.com/serve/-/serve-13.0.2.tgz#b19ccb854dfdf3085613cd3a4033c7807aeaf85b" + integrity sha512-71R6fKvNgKrqARAag6lYJNnxDzpH7DCNrMuvPY5PLVaC2PDhJsGTj/34o4o4tPWhTuLgEXqvgnAWbATQ9zGZTQ== dependencies: "@zeit/schemas" "2.6.0" - ajv "6.5.3" + ajv "6.12.6" arg "2.0.0" - boxen "1.3.0" + boxen "5.1.2" chalk "2.4.1" - clipboardy "1.2.3" + clipboardy "2.3.0" compression "1.7.3" - serve-handler "6.1.2" + serve-handler "6.1.3" update-check "1.5.2" set-blocking@^2.0.0: @@ -8106,46 +7821,69 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shelljs@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" - integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shiki@^0.9.12: + version "0.9.15" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.9.15.tgz#2481b46155364f236651319d2c18e329ead6fa44" + integrity sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw== dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" + jsonc-parser "^3.0.0" + vscode-oniguruma "^1.6.1" + vscode-textmate "5.2.0" -side-channel@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +smart-buffer@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== snapdragon-node@^2.0.1: version "2.1.1" @@ -8177,25 +7915,26 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sockjs-client@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" - integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== +sockjs-client@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.2.tgz#4bc48c2da9ce4769f19dc723396b50f5c12330a3" + integrity sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ== dependencies: - debug "^3.2.5" + debug "^3.2.6" eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" - json3 "^3.3.2" - url-parse "^1.4.3" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.5.3" -sockjs@0.3.19: - version "0.3.19" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== +sockjs@^0.3.21: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: - faye-websocket "^0.10.0" - uuid "^3.0.1" + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" sort-keys@^1.0.0: version "1.1.2" @@ -8209,6 +7948,11 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +source-map-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -8220,20 +7964,20 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.16, source-map-support@~0.5.10, source-map-support@~0.5.12: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== +source-map-support@^0.5.16, source-map-support@^0.5.19, source-map-support@^0.5.21, source-map-support@~0.5.12: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -8248,32 +7992,6 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -8286,7 +8004,7 @@ spdy-transport@^3.0.0: readable-stream "^3.0.6" wbuf "^1.7.3" -spdy@^4.0.1: +spdy@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== @@ -8315,25 +8033,20 @@ sprintf-js@~1.0.2: integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" ssri@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" - integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== + version "7.1.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.1.tgz#33e44f896a967158e3c63468e47ec46613b95b5f" + integrity sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw== dependencies: figgy-pudding "^3.5.1" minipass "^3.1.1" -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - stat-mode@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" @@ -8389,23 +8102,6 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -8415,60 +8111,44 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" -string.prototype.matchall@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" - integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - has-symbols "^1.0.1" - internal-slot "^1.0.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" - -string.prototype.trimend@^1.0.0, string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trimleft@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" - integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== +string.prototype.matchall@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" + integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimstart "^1.0.0" - -string.prototype.trimright@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" - integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimend "^1.0.0" -string.prototype.trimstart@^1.0.0, string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -8484,20 +8164,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: +strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -8505,12 +8178,12 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -8522,10 +8195,10 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-json-comments@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" - integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: version "2.0.1" @@ -8533,12 +8206,12 @@ strip-json-comments@~2.0.1: integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= style-loader@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.3.tgz#9e826e69c683c4d9bf9db924f85e9abb30d5e200" - integrity sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" + integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== dependencies: - loader-utils "^1.2.3" - schema-utils "^2.6.4" + loader-utils "^2.0.0" + schema-utils "^2.7.0" sumchecker@^3.0.1: version "3.0.1" @@ -8547,25 +8220,6 @@ sumchecker@^3.0.1: dependencies: debug "^4.1.0" -supports-color@6.1.0, supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= - dependencies: - has-flag "^1.0.0" - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -8573,54 +8227,19 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - integrity sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U= +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" + has-flag "^3.0.0" -svgo@^1.0.5: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" + has-flag "^4.0.0" taffydb@2.6.2: version "2.6.2" @@ -8632,69 +8251,48 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -temp-file@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.3.7.tgz#686885d635f872748e384e871855958470aeb18a" - integrity sha512-9tBJKt7GZAQt/Rg0QzVWA8Am8c1EFl+CAv04/aBVqlx5oyfQ508sFIABshQ0xbZu6mBrFLWIUXO/bbLYghW70g== +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== dependencies: async-exit-hook "^2.0.1" - fs-extra "^8.1.0" - -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= - dependencies: - execa "^0.7.0" - -term-size@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" - integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== + fs-extra "^10.0.0" terser-webpack-plugin@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" - integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== dependencies: cacache "^12.0.2" find-cache-dir "^2.1.0" is-wsl "^1.1.0" schema-utils "^1.0.0" - serialize-javascript "^2.1.2" + serialize-javascript "^4.0.0" source-map "^0.6.1" terser "^4.1.2" webpack-sources "^1.4.0" worker-farm "^1.7.0" terser-webpack-plugin@^2.3.5: - version "2.3.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81" - integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w== + version "2.3.8" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724" + integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w== dependencies: cacache "^13.0.1" - find-cache-dir "^3.2.0" - jest-worker "^25.1.0" - p-limit "^2.2.2" - schema-utils "^2.6.4" - serialize-javascript "^2.1.2" + find-cache-dir "^3.3.1" + jest-worker "^25.4.0" + p-limit "^2.3.0" + schema-utils "^2.6.6" + serialize-javascript "^4.0.0" source-map "^0.6.1" - terser "^4.4.3" + terser "^4.6.12" webpack-sources "^1.4.3" -terser@^3.8.1: - version "3.17.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" - integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== - dependencies: - commander "^2.19.0" - source-map "~0.6.1" - source-map-support "~0.5.10" - -terser@^4.1.2, terser@^4.4.3, terser@^4.6.3: - version "4.6.10" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.10.tgz#90f5bd069ff456ddbc9503b18e52f9c493d3b7c2" - integrity sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA== +terser@^4.1.2, terser@^4.6.12, terser@^4.6.3: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -8713,36 +8311,38 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: setimmediate "^1.0.4" -tippy.js@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-5.2.1.tgz#e08d7332c103a15e427124d710d881fca82365d6" - integrity sha512-66UT6JRVn3dXNCORE+0UvUK3JZqV/VhLlU6HTDm3FmrweUUFUxUGvT8tUQ7ycMp+uhuLAwQw6dBabyC+iKf/MA== +tippy.js@: + version "6.3.7" + resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" + integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ== dependencies: - popper.js "^1.16.0" + "@popperjs/core" "^2.9.0" -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== dependencies: - os-tmpdir "~1.0.2" + rimraf "^3.0.0" to-arraybuffer@^1.0.0: version "1.0.1" @@ -8774,6 +8374,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -8796,25 +8403,30 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== +tsconfig-paths@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b" + integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3, tslib@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -8828,22 +8440,22 @@ tunnel@^0.0.6: resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - prelude-ls "~1.1.2" + prelude-ls "^1.2.1" -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== -type-fest@^0.8.0, type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" @@ -8865,79 +8477,64 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typedoc-default-themes@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.10.2.tgz#743380a80afe62c5ef92ca1bd4abe2ac596be4d2" - integrity sha512-zo09yRj+xwLFE3hyhJeVHWRSPuKEIAsFK5r2u47KL/HBKqpwdUSanoaz5L34IKiSATFrjG5ywmIu98hPVMfxZg== - dependencies: - lunr "^2.3.8" - -typedoc-plugin-external-module-name@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/typedoc-plugin-external-module-name/-/typedoc-plugin-external-module-name-3.1.0.tgz#3c2dc72ee6fa511efdee21f9f470140a5c69042b" - integrity sha512-7Jym2cOkSbMtXRb2C9RytIihryB/a7UZZbCWeIZ+PoSxglOwiHqTAPWWVN2AbVKh3iKy8PpGRCYggfDnpb177g== - dependencies: - lodash "^4.1.2" - semver "^7.1.1" - -typedoc@^0.17.8: - version "0.17.8" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.17.8.tgz#96b67e9454aa7853bfc4dc9a55c8a07adfd5478e" - integrity sha512-/OyrHCJ8jtzu+QZ+771YaxQ9s4g5Z3XsQE3Ma7q+BL392xxBn4UMvvCdVnqKC2T/dz03/VXSLVKOP3lHmDdc/w== +typedoc@: + version "0.22.10" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.10.tgz#221e1a2b17bcb71817ef027dc4c4969d572e7620" + integrity sha512-hQYZ4WtoMZ61wDC6w10kxA42+jclWngdmztNZsDvIz7BMJg7F2xnT+uYsUa7OluyKossdFj9E9Ye4QOZKTy8SA== dependencies: - fs-extra "^8.1.0" - handlebars "^4.7.6" - highlight.js "^10.0.0" - lodash "^4.17.15" - lunr "^2.3.8" - marked "1.0.0" - minimatch "^3.0.0" - progress "^2.0.3" - shelljs "^0.8.4" - typedoc-default-themes "^0.10.2" + glob "^7.2.0" + lunr "^2.3.9" + marked "^3.0.8" + minimatch "^3.0.4" + shiki "^0.9.12" -typescript@^3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" - integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== +typescript@: + version "4.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.3.tgz#afaa858e68c7103317d89eb90c5d8906268d353c" + integrity sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== -uglify-js@^3.1.4: - version "3.10.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.0.tgz#397a7e6e31ce820bfd1cb55b804ee140c587a9e7" - integrity sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA== +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" -underscore@~1.9.1: - version "1.9.2" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.2.tgz#0c8d6f536d6f378a5af264a72f7bec50feb7cf2f" - integrity sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ== +underscore@~1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" + integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" - integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== -unicode-property-aliases-ecmascript@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" - integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== union-value@^1.0.0: version "1.0.1" @@ -8949,16 +8546,6 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -8985,21 +8572,16 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -9030,29 +8612,30 @@ update-check@1.5.2: registry-auth-token "3.3.2" registry-url "3.1.0" -update-notifier@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" - integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== dependencies: - boxen "^4.2.0" - chalk "^3.0.0" + boxen "^5.0.0" + chalk "^4.1.0" configstore "^5.0.1" has-yarn "^2.1.0" import-lazy "^2.1.0" is-ci "^2.0.0" - is-installed-globally "^0.3.1" - is-npm "^4.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" is-yarn-global "^0.3.0" - latest-version "^5.0.0" - pupa "^2.0.1" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" semver-diff "^3.1.1" xdg-basedir "^4.0.0" uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -9062,13 +8645,13 @@ urix@^0.1.0: integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.0.0.tgz#946719464089e35804009270339f21124e8dd27e" - integrity sha512-sPsoBs8NkSJt9k/2zLUMDAf0rYaG00EtrFQpHRIphKrR6stGsO92LUJf/uUeQNKEoxqoJ4R4qDLqHl+AOEqolA== + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== dependencies: loader-utils "^2.0.0" - mime-types "^2.1.26" - schema-utils "^2.6.5" + mime-types "^2.1.27" + schema-utils "^3.0.0" url-parse-lax@^3.0.0: version "3.0.0" @@ -9077,10 +8660,10 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.4.3: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== +url-parse@^1.4.3, url-parse@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" + integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -9103,7 +8686,7 @@ utf8-byte-length@^1.0.1: resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -9116,16 +8699,6 @@ util.promisify@1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -9140,7 +8713,7 @@ util@^0.11.0: dependencies: inherits "2.0.3" -utila@^0.4.0, utila@~0.4: +utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= @@ -9150,52 +8723,67 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.1, uuid@^3.3.2: +uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v8-compile-cache@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" - integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== - -v8-compile-cache@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" +v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -watchpack@^1.6.0: +vscode-oniguruma@^1.6.1: version "1.6.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2" - integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA== + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz#2bf4dfcfe3dd2e56eb549a3068c8ee39e6c30ce5" + integrity sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ== + +vscode-textmate@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== dependencies: chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: graceful-fs "^4.1.2" neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" @@ -9215,26 +8803,26 @@ webcola@^3.4.0: d3-timer "^1.0.5" webpack-cli@^3.3.11: - version "3.3.11" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" - integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g== - dependencies: - chalk "2.4.2" - cross-spawn "6.0.5" - enhanced-resolve "4.1.0" - findup-sync "3.0.0" - global-modules "2.0.0" - import-local "2.0.0" - interpret "1.2.0" - loader-utils "1.2.3" - supports-color "6.1.0" - v8-compile-cache "2.0.3" - yargs "13.2.4" + version "3.3.12" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" + integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== + dependencies: + chalk "^2.4.2" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.1" + findup-sync "^3.0.0" + global-modules "^2.0.0" + import-local "^2.0.0" + interpret "^1.4.0" + loader-utils "^1.4.0" + supports-color "^6.1.0" + v8-compile-cache "^2.1.1" + yargs "^13.3.2" webpack-dev-middleware@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" - integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== dependencies: memory-fs "^0.4.1" mime "^2.4.4" @@ -9243,11 +8831,11 @@ webpack-dev-middleware@^3.7.2: webpack-log "^2.0.0" webpack-dev-server@^3.10.3: - version "3.10.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0" - integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ== + version "3.11.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz#8c86b9d2812bf135d3c9bce6f07b718e30f7c3d3" + integrity sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA== dependencies: - ansi-html "0.0.7" + ansi-html-community "0.0.8" bonjour "^3.5.0" chokidar "^2.1.8" compression "^1.7.4" @@ -9255,31 +8843,31 @@ webpack-dev-server@^3.10.3: debug "^4.1.1" del "^4.1.1" express "^4.17.1" - html-entities "^1.2.1" + html-entities "^1.3.1" http-proxy-middleware "0.19.1" import-local "^2.0.0" internal-ip "^4.3.0" ip "^1.1.5" is-absolute-url "^3.0.3" killable "^1.0.1" - loglevel "^1.6.6" + loglevel "^1.6.8" opn "^5.5.0" p-retry "^3.0.1" - portfinder "^1.0.25" + portfinder "^1.0.26" schema-utils "^1.0.0" - selfsigned "^1.10.7" + selfsigned "^1.10.8" semver "^6.3.0" serve-index "^1.9.1" - sockjs "0.3.19" - sockjs-client "1.4.0" - spdy "^4.0.1" + sockjs "^0.3.21" + sockjs-client "^1.5.0" + spdy "^4.0.2" strip-ansi "^3.0.1" supports-color "^6.1.0" url "^0.11.0" webpack-dev-middleware "^3.7.2" webpack-log "^2.0.0" ws "^6.2.1" - yargs "12.0.5" + yargs "^13.3.2" webpack-log@^2.0.0: version "2.0.0" @@ -9304,20 +8892,20 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack- source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.41.4: - version "4.42.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.1.tgz#ae707baf091f5ca3ef9c38b884287cfe8f1983ef" - integrity sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg== +webpack@^4: + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== dependencies: "@webassemblyjs/ast" "1.9.0" "@webassemblyjs/helper-module-context" "1.9.0" "@webassemblyjs/wasm-edit" "1.9.0" "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.2.1" + acorn "^6.4.1" ajv "^6.10.2" ajv-keywords "^3.4.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^4.1.0" + enhanced-resolve "^4.5.0" eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" loader-runner "^2.4.0" @@ -9330,27 +8918,33 @@ webpack@^4.41.4: schema-utils "^1.0.0" tapable "^1.1.3" terser-webpack-plugin "^1.4.3" - watchpack "^1.6.0" + watchpack "^1.7.4" webpack-sources "^1.4.1" -websocket-driver@>=0.5.1: - version "0.7.3" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" - integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: - http-parser-js ">=0.4.0 <0.4.11" + http-parser-js ">=0.5.1" safe-buffer ">=5.1.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" which-module@^2.0.0: version "2.0.0" @@ -9364,12 +8958,12 @@ which@^1.2.14, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - string-width "^2.1.1" + isexe "^2.0.0" widest-line@^3.1.0: version "3.1.0" @@ -9378,16 +8972,11 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -word-wrap@~1.2.3: +word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -9395,14 +8984,6 @@ worker-farm@^1.7.0: dependencies: errno "~0.1.7" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -9421,6 +9002,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -9436,17 +9026,10 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== dependencies: async-limiter "~1.0.0" @@ -9455,10 +9038,20 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xmlcreate@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.3.tgz#df9ecd518fd3890ab3548e1b811d040614993497" - integrity sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ== +xmlbuilder@>=11.0.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xmlcreate@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" + integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== xpipe@*: version "1.0.5" @@ -9470,21 +9063,21 @@ xtend@^4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yaku@^0.16.6: version "0.16.7" resolved "https://registry.yarnpkg.com/yaku/-/yaku-0.16.7.tgz#1d195c78aa9b5bf8479c895b9504fd4f0847984e" integrity sha1-HRlceKqbW/hHnIlblQT9TwhHmE4= -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -9495,15 +9088,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^13.1.0: +yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== @@ -9511,53 +9096,39 @@ yargs-parser@^13.1.0: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.1: - version "18.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" - integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" +yargs-parser@^21.0.0: + version "21.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" + integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== -yargs@13.2.4: - version "13.2.4" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" - integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" find-up "^3.0.0" get-caller-file "^2.0.1" - os-locale "^3.1.0" require-directory "^2.1.1" require-main-filename "^2.0.0" set-blocking "^2.0.0" string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.0" + yargs-parser "^13.1.2" -yargs@^15.1.0, yargs@^15.3.1: - version "15.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" - integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" decamelize "^1.2.0" @@ -9569,7 +9140,20 @@ yargs@^15.1.0, yargs@^15.3.1: string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^18.1.1" + yargs-parser "^18.1.2" + +yargs@^17.0.1: + version "17.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.0.tgz#295c4ffd0eef148ef3e48f7a2e0f58d0e4f26b1c" + integrity sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" yauzl@^2.10.0: version "2.10.0" @@ -9579,9 +9163,10 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" -zeromq@^6.0.0-beta.5: - version "6.0.0-beta.6" - resolved "https://registry.yarnpkg.com/zeromq/-/zeromq-6.0.0-beta.6.tgz#2b8934cafce735ea9007fd3074ec8aca9bf11204" - integrity sha512-wLf6M7pBHijl+BRltUL2VoDpgbQcOZetiX8UzycHL8CcYFxYnRrpoG5fi3UX3+Umavz1lk4/dGaQez8qiDgr/Q== +zeromq@^5.2.8: + version "5.2.8" + resolved "https://registry.yarnpkg.com/zeromq/-/zeromq-5.2.8.tgz#94b0b85e4152e98b8bb163f1db4a34280d44d9d0" + integrity sha512-bXzsk7KOmgLSv1tC0Ms1VXBy90+Rz27ZYf27cLuldRYbpqYpuWJfxxHFhO710t22zgWBnmdUP0m3SKFpLI0u5g== dependencies: - node-gyp-build "^4.1.0" + nan "2.14.2" + node-gyp-build "^4.2.3" diff --git a/opam/opam b/opam/opam index 559de590a79609eb11df3c6eb7c122229a08e705..540d6697b54ae837ac96493f0218b64b5a89d7a1 100644 --- a/opam/opam +++ b/opam/opam @@ -142,13 +142,6 @@ depopts: [ "zmq" ] -messages: [ - "The Frama-C/Wp now uses Why-3 for all provers (Cf. deprecated -wp-prover native:alt-ergo)" - {alt-ergo:installed} - "The Frama-C/Wp native support for Coq is deprecated and only activated with Coq.8.13.x (use TIP or Why-3 instead)." - {coq:installed} -] - post-messages: [ "Why3 provers setup: rm -f ~/.why3.conf ; why3 config detect" ] diff --git a/share/autocomplete_frama-c b/share/autocomplete_frama-c index 0637900a8bc57ac7f9d94af7d12540bbb93ca1b9..5b1d86283067ec54e0d2aa043579fa320c96999a 100644 --- a/share/autocomplete_frama-c +++ b/share/autocomplete_frama-c @@ -94,7 +94,7 @@ _frama-c () then local prefix=; [[ $cur == *,* ]] && prefix="${cur%,*}," advance_options="$(frama-c -wp-detect | grep -E -o " \[.*" | grep -E -o "[^][|]*")" - advance_options+=" none script tip native:alt-ergo native:coq native:coqide" + advance_options+=" none script tip" local ambigous="$(bind -v | grep show-all-if-ambiguous)" ambigous="${ambigous##* }" if [[ "$ambigous" == "on" ]] diff --git a/share/compliance/c11_functions.json b/share/compliance/c11_functions.json index 2f7d18b10365d5a192c1aad54c37acd9433ca51b..6f69e6149ee7e3f749df48337f4f5502a146dc47 100644 --- a/share/compliance/c11_functions.json +++ b/share/compliance/c11_functions.json @@ -1,14 +1,16 @@ { - "description": "C11 reserved function identifiers", + "description": "C11 reserved function and macro identifiers", "notes": { "description": "The 'notes' field is a list of characteristics related to CWEs or that may affect the 'difficulty' of analyzing such functions with Frama-C. Each note is succintly described below.", "variadic":"Variadic function, OR having an argument of type va_list.", - "safer-alts":"A list of recommended alternatives for functions considered unsafe (CWE-242, CWE-477, CWE-676)." + "safer-alts":"A list of recommended alternatives for functions considered unsafe (CWE-242, CWE-477, CWE-676).", + "not-in-posix":"This identifier is absent from POSIX-1.2008.", + "macro":"C11 specifies this identifier as a macro, not a function." }, "source":"ISO/IEC 9899:2011", "data":{ "abort":{"header":"stdlib.h"}, - "abort_handler_s": {"header":"stdlib.h"}, + "abort_handler_s": {"header":"stdlib.h", "notes":{"not-in-posix":true}}, "abs": {"header":"stdlib.h"}, "acos": {"header":"math.h"}, "acosf": {"header":"math.h"}, @@ -16,16 +18,16 @@ "acoshf": {"header":"math.h"}, "acoshl": {"header":"math.h"}, "acosl": {"header":"math.h"}, - "aligned_alloc": {"header":"stdlib.h"}, + "aligned_alloc": {"header":"stdlib.h", "notes":{"not-in-posix":true}}, "asctime": {"header":"time.h", "notes":{"safer-alts":["asctime_s"]}}, - "asctime_s": {"header":"time.h"}, + "asctime_s": {"header":"time.h", "notes":{"not-in-posix":true}}, "asin": {"header":"math.h"}, "asinf": {"header":"math.h"}, "asinh": {"header":"math.h"}, "asinhf": {"header":"math.h"}, "asinhl": {"header":"math.h"}, "asinl": {"header":"math.h"}, - "at_quick_exit": {"header":"stdlib.h"}, + "at_quick_exit": {"header":"stdlib.h", "notes":{"not-in-posix":true}}, "atan": {"header":"math.h"}, "atan2": {"header":"math.h"}, "atan2f": {"header":"math.h"}, @@ -39,31 +41,31 @@ "atoi": {"header":"stdlib.h"}, "atol": {"header":"stdlib.h"}, "atoll": {"header":"stdlib.h"}, - "atomic_compare_exchange_strong": {"header":"stdatomic.h"}, - "atomic_compare_exchange_strong_explicit": {"header":"stdatomic.h"}, - "atomic_compare_exchange_weak": {"header":"stdatomic.h"}, - "atomic_compare_exchange_weak_explicit": {"header":"stdatomic.h"}, - "atomic_exchange": {"header":"stdatomic.h"}, - "atomic_exchange_explicit": {"header":"stdatomic.h"}, - "atomic_fetch_key": {"header":"stdatomic.h"}, - "atomic_fetch_key_explicit": {"header":"stdatomic.h"}, - "atomic_flag_clear": {"header":"stdatomic.h"}, - "atomic_flag_clear_explicit": {"header":"stdatomic.h"}, - "atomic_flag_test_and_set": {"header":"stdatomic.h"}, - "atomic_flag_test_and_set_explicit": {"header":"stdatomic.h"}, - "atomic_init": {"header":"stdatomic.h"}, - "atomic_is_lock_free": {"header":"stdatomic.h"}, - "atomic_load": {"header":"stdatomic.h"}, - "atomic_load_explicit": {"header":"stdatomic.h"}, - "atomic_signal_fence": {"header":"stdatomic.h"}, - "atomic_store": {"header":"stdatomic.h"}, - "atomic_store_explicit": {"header":"stdatomic.h"}, - "atomic_thread_fence": {"header":"stdatomic.h"}, + "atomic_compare_exchange_strong": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_compare_exchange_strong_explicit": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_compare_exchange_weak": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_compare_exchange_weak_explicit": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_exchange": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_exchange_explicit": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_fetch_key": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_fetch_key_explicit": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_flag_clear": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_flag_clear_explicit": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_flag_test_and_set": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_flag_test_and_set_explicit": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_init": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_is_lock_free": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_load": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_load_explicit": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_signal_fence": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_store": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_store_explicit": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, + "atomic_thread_fence": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, "bsearch": {"header":"stdlib.h", "notes":{"safer-alts":["bsearch_s"]}}, - "bsearch_s": {"header":"stdlib.h"}, + "bsearch_s": {"header":"stdlib.h", "notes":{"not-in-posix":true}}, "btowc": {"header":"wchar.h"}, - "c16rtomb": {"header":"uchar.h"}, - "c32rtomb": {"header":"uchar.h"}, + "c16rtomb": {"header":"uchar.h", "notes":{"not-in-posix":true}}, + "c32rtomb": {"header":"uchar.h", "notes":{"not-in-posix":true}}, "cabs": {"header":"complex.h"}, "cabsf": {"header":"complex.h"}, "cabsl": {"header":"complex.h"}, @@ -73,7 +75,7 @@ "cacoshf": {"header":"complex.h"}, "cacoshl": {"header":"complex.h"}, "cacosl": {"header":"complex.h"}, - "call_once": {"header":"threads.h"}, + "call_once": {"header":"threads.h", "notes":{"not-in-posix":true}}, "calloc": {"header":"stdlib.h"}, "carg": {"header":"complex.h"}, "cargf": {"header":"complex.h"}, @@ -156,7 +158,7 @@ "ctanhl": {"header":"complex.h"}, "ctanl": {"header":"complex.h"}, "ctime": {"header":"time.h"}, - "ctime_s": {"header":"time.h"}, + "ctime_s": {"header":"time.h", "notes":{"not-in-posix":true}}, "difftime": {"header":"time.h"}, "div": {"header":"stdlib.h"}, "erf": {"header":"math.h"}, @@ -217,10 +219,10 @@ "fmodf": {"header":"math.h"}, "fmodl": {"header":"math.h"}, "fopen": {"header":"stdio.h", "notes":{"safer-alts":["fopen_s"]}}, - "fopen_s": {"header":"stdio.h"}, - "fpclassify": {"header":"math.h"}, + "fopen_s": {"header":"stdio.h", "notes":{"not-in-posix":true}}, + "fpclassify": {"header":"math.h", "notes":{"macro":true}}, "fprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["fprintf_s"]}}, - "fprintf_s": {"header":"stdio.h", "notes":{"variadic":true}}, + "fprintf_s": {"header":"stdio.h", "notes":{"variadic":true, "not-in-posix":true}}, "fputc": {"header":"stdio.h"}, "fputs": {"header":"stdio.h"}, "fputwc": {"header":"wchar.h"}, @@ -228,34 +230,34 @@ "fread": {"header":"stdio.h"}, "free": {"header":"stdlib.h"}, "freopen": {"header":"stdio.h", "notes":{"safer-alts":["freopen_s"]}}, - "freopen_s": {"header":"stdio.h"}, + "freopen_s": {"header":"stdio.h", "notes":{"not-in-posix":true}}, "frexp": {"header":"math.h"}, "frexpf": {"header":"math.h"}, "frexpl": {"header":"math.h"}, "fscanf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["fscanf_s"]}}, - "fscanf_s": {"header":"stdio.h", "notes":{"variadic":true}}, + "fscanf_s": {"header":"stdio.h", "notes":{"variadic":true, "not-in-posix":true}}, "fseek": {"header":"stdio.h"}, "fsetpos": {"header":"stdio.h"}, "ftell": {"header":"stdio.h"}, "fwide": {"header":"wchar.h"}, "fwprintf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["fwprintf_s"]}}, - "fwprintf_s": {"header":"wchar.h", "notes":{"variadic":true}}, + "fwprintf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix": true}}, "fwrite": {"header":"stdio.h"}, "fwscanf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["fwscanf_s"]}}, - "fwscanf_s": {"header":"wchar.h", "notes":{"variadic":true}}, + "fwscanf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix":true}}, "getc": {"header":"stdio.h"}, "getchar": {"header":"stdio.h"}, "getenv": {"header":"stdlib.h", "notes":{"safer-alts":["getenv_s"]}}, - "getenv_s": {"header":"stdlib.h"}, - "gets_s": {"header":"stdio.h"}, + "getenv_s": {"header":"stdlib.h", "notes":{"not-in-posix":true}}, + "gets_s": {"header":"stdio.h", "notes":{"not-in-posix":true}}, "getwc": {"header":"wchar.h"}, "getwchar": {"header":"wchar.h"}, "gmtime": {"header":"time.h", "notes":{"safer-alts":["gmtime_s"]}}, - "gmtime_s": {"header":"time.h"}, + "gmtime_s": {"header":"time.h", "notes":{"not-in-posix":true}}, "hypot": {"header":"math.h"}, "hypotf": {"header":"math.h"}, "hypotl": {"header":"math.h"}, - "ignore_handler_s": {"header":"stdlib.h"}, + "ignore_handler_s": {"header":"stdlib.h", "notes":{"not-in-posix":true}}, "ilogb": {"header":"math.h"}, "ilogbf": {"header":"math.h"}, "ilogbl": {"header":"math.h"}, @@ -266,21 +268,21 @@ "isblank": {"header":"ctype.h"}, "iscntrl": {"header":"ctype.h"}, "isdigit": {"header":"ctype.h"}, - "isfinite": {"header":"math.h"}, + "isfinite": {"header":"math.h", "notes":{"macro":true}}, "isgraph": {"header":"ctype.h"}, - "isgreater": {"header":"math.h"}, - "isgreaterequal": {"header":"math.h"}, - "isinf": {"header":"math.h"}, - "isless": {"header":"math.h"}, - "islessequal": {"header":"math.h"}, - "islessgreater": {"header":"math.h"}, + "isgreater": {"header":"math.h", "notes":{"macro":true}}, + "isgreaterequal": {"header":"math.h", "notes":{"macro":true}}, + "isinf": {"header":"math.h", "notes":{"macro":true}}, + "isless": {"header":"math.h", "notes":{"macro":true}}, + "islessequal": {"header":"math.h", "notes":{"macro":true}}, + "islessgreater": {"header":"math.h", "notes":{"macro":true}}, "islower": {"header":"ctype.h"}, - "isnan": {"header":"math.h"}, - "isnormal": {"header":"math.h"}, + "isnan": {"header":"math.h", "notes":{"macro":true}}, + "isnormal": {"header":"math.h", "notes":{"macro":true}}, "isprint": {"header":"ctype.h"}, "ispunct": {"header":"ctype.h"}, "isspace": {"header":"ctype.h"}, - "isunordered": {"header":"math.h"}, + "isunordered": {"header":"math.h", "notes":{"macro":true}}, "isupper": {"header":"ctype.h"}, "iswalnum": {"header":"wctype.h"}, "iswalpha": {"header":"wctype.h"}, @@ -296,7 +298,7 @@ "iswupper": {"header":"wctype.h"}, "iswxdigit": {"header":"wctype.h"}, "isxdigit": {"header":"ctype.h"}, - "kill_dependency": {"header":"stdatomic.h"}, + "kill_dependency": {"header":"stdatomic.h", "notes":{"not-in-posix":true}}, "labs": {"header":"stdlib.h"}, "ldexp": {"header":"math.h"}, "ldexpf": {"header":"math.h"}, @@ -315,7 +317,7 @@ "llroundl": {"header":"math.h"}, "localeconv": {"header":"locale.h"}, "localtime": {"header":"time.h", "notes":{"safer-alts":["localtime_s"]}}, - "localtime_s": {"header":"time.h"}, + "localtime_s": {"header":"time.h", "notes":{"not-in-posix":true}}, "log": {"header":"math.h"}, "log10": {"header":"math.h"}, "log10f": {"header":"math.h"}, @@ -346,28 +348,28 @@ "mbrtowc": {"header":"wchar.h"}, "mbsinit": {"header":"wchar.h"}, "mbsrtowcs": {"header":"wchar.h", "notes":{"safer-alts":["mbsrtowcs_s"]}}, - "mbsrtowcs_s": {"header":"wchar.h"}, + "mbsrtowcs_s": {"header":"wchar.h", "notes":{"not-in-posix":true}}, "mbstowcs": {"header":"stdlib.h", "notes":{"safer-alts":["mbstowcs_s"]}}, - "mbstowcs_s": {"header":"stdlib.h"}, + "mbstowcs_s": {"header":"stdlib.h", "notes":{"not-in-posix":true}}, "mbtowc": {"header":"stdlib.h"}, "memchr": {"header":"string.h"}, "memcmp": {"header":"string.h"}, "memcpy": {"header":"string.h", "notes":{"safer-alts":["memcpy_s"]}}, - "memcpy_s": {"header":"string.h"}, + "memcpy_s": {"header":"string.h", "notes":{"not-in-posix":true}}, "memmove": {"header":"string.h", "notes":{"safer-alts":["memmove_s"]}}, - "memmove_s": {"header":"string.h"}, + "memmove_s": {"header":"string.h", "notes":{"not-in-posix":true}}, "memset": {"header":"string.h", "notes":{"safer-alts":["memset_s"]}}, - "memset_s": {"header":"string.h"}, + "memset_s": {"header":"string.h", "notes":{"not-in-posix":true}}, "mktime": {"header":"time.h"}, "modf": {"header":"math.h"}, "modff": {"header":"math.h"}, "modfl": {"header":"math.h"}, - "mtx_destroy": {"header":"threads.h"}, - "mtx_init": {"header":"threads.h"}, - "mtx_lock": {"header":"threads.h"}, - "mtx_timedlock": {"header":"threads.h"}, - "mtx_trylock": {"header":"threads.h"}, - "mtx_unlock": {"header":"threads.h"}, + "mtx_destroy": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "mtx_init": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "mtx_lock": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "mtx_timedlock": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "mtx_trylock": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "mtx_unlock": {"header":"threads.h", "notes":{"not-in-posix":true}}, "nan": {"header":"math.h"}, "nanf": {"header":"math.h"}, "nanl": {"header":"math.h"}, @@ -385,15 +387,15 @@ "powf": {"header":"math.h"}, "powl": {"header":"math.h"}, "printf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["printf_s"]}}, - "printf_s": {"header":"stdio.h"}, + "printf_s": {"header":"stdio.h", "notes":{"not-in-posix":true}}, "putc": {"header":"stdio.h"}, "putchar": {"header":"stdio.h"}, "puts": {"header":"stdio.h"}, "putwc": {"header":"wchar.h"}, "putwchar": {"header":"wchar.h"}, "qsort": {"header":"stdlib.h"}, - "qsort_s": {"header":"stdlib.h"}, - "quick_exit": {"header":"stdlib.h"}, + "qsort_s": {"header":"stdlib.h", "notes":{"not-in-posix":true}}, + "quick_exit": {"header":"stdlib.h", "notes":{"not-in-posix":true}}, "raise": {"header":"signal.h"}, "rand": {"header":"stdlib.h"}, "realloc": {"header":"stdlib.h"}, @@ -419,14 +421,14 @@ "scalbnf": {"header":"math.h"}, "scalbnl": {"header":"math.h"}, "scanf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["scanf_s"]}}, - "scanf_s": {"header":"stdio.h", "notes":{"variadic":true}}, - "set_constraint_handler_s": {"header":"stdlib.h"}, + "scanf_s": {"header":"stdio.h", "notes":{"variadic":true, "not-in-posix":true}}, + "set_constraint_handler_s": {"header":"stdlib.h", "notes":{"not-in-posix":true}}, "setbuf": {"header":"stdio.h"}, "setjmp": {"header":"setjmp.h"}, "setlocale": {"header":"locale.h"}, "setvbuf": {"header":"stdio.h"}, "signal": {"header":"signal.h"}, - "signbit": {"header":"math.h"}, + "signbit": {"header":"math.h", "notes":{"macro":true}}, "sin": {"header":"math.h"}, "sinf": {"header":"math.h"}, "sinh": {"header":"math.h"}, @@ -434,35 +436,35 @@ "sinhl": {"header":"math.h"}, "sinl": {"header":"math.h"}, "snprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["snprintf_s", "sprintf_s"]}}, - "snprintf_s": {"header":"stdio.h", "notes":{"variadic":true}}, - "snwprintf_s": {"header":"wchar.h"}, + "snprintf_s": {"header":"stdio.h", "notes":{"variadic":true, "not-in-posix":true}}, + "snwprintf_s": {"header":"wchar.h", "notes":{"not-in-posix":true}}, "sprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["sprintf_s", "snprintf_s"]}}, - "sprintf_s": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["snprintf_s"]}}, + "sprintf_s": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["snprintf_s"], "not-in-posix":true}}, "sqrt": {"header":"math.h"}, "sqrtf": {"header":"math.h"}, "sqrtl": {"header":"math.h"}, "srand": {"header":"stdlib.h"}, "sscanf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["sscanf_s"]}}, - "sscanf_s": {"header":"stdio.h", "notes":{"variadic":true}}, + "sscanf_s": {"header":"stdio.h", "notes":{"variadic":true, "not-in-posix":true}}, "strcat": {"header":"string.h", "notes":{"safer-alts":["strcat_s", "strncat_s", "strlcat", "strncat"]}}, - "strcat_s": {"header":"string.h"}, + "strcat_s": {"header":"string.h", "notes":{"not-in-posix":true}}, "strchr": {"header":"string.h"}, "strcmp": {"header":"string.h"}, "strcoll": {"header":"string.h"}, "strcpy": {"header":"string.h", "notes":{"safer-alts":["strcpy_s", "strncpy_s", "strlcpy", "strncpy"]}}, - "strcpy_s": {"header":"string.h"}, + "strcpy_s": {"header":"string.h", "notes":{"not-in-posix":true}}, "strcspn": {"header":"string.h"}, "strerror": {"header":"string.h"}, - "strerror_s": {"header":"string.h"}, - "strerrorlen_s": {"header":"string.h"}, + "strerror_s": {"header":"string.h", "notes":{"not-in-posix":true}}, + "strerrorlen_s": {"header":"string.h", "notes":{"not-in-posix":true}}, "strftime": {"header":"time.h"}, "strlen": {"header":"string.h", "notes":{"safer-alts":["strnlen_s"]}}, "strncat": {"header":"string.h", "notes":{"safer-alts":["strncat_s", "strlcat"]}}, - "strncat_s": {"header":"string.h"}, + "strncat_s": {"header":"string.h", "notes":{"not-in-posix":true}}, "strncmp": {"header":"string.h"}, "strncpy": {"header":"string.h", "notes":{"safer-alts":["strncpy_s", "strlcpy"]}}, - "strncpy_s": {"header":"string.h"}, - "strnlen_s": {"header":"string.h"}, + "strncpy_s": {"header":"string.h", "notes":{"not-in-posix":true}}, + "strnlen_s": {"header":"string.h", "notes":{"not-in-posix":true}}, "strpbrk": {"header":"string.h"}, "strrchr": {"header":"string.h"}, "strspn": {"header":"string.h"}, @@ -471,7 +473,7 @@ "strtof": {"header":"stdlib.h"}, "strtoimax": {"header":"inttypes.h"}, "strtok": {"header":"string.h", "notes":{"safer-alts":["strtok_s"]}}, - "strtok_s": {"header":"string.h"}, + "strtok_s": {"header":"string.h", "notes":{"not-in-posix":true}}, "strtol": {"header":"stdlib.h"}, "strtold": {"header":"stdlib.h"}, "strtoll": {"header":"stdlib.h"}, @@ -480,9 +482,9 @@ "strtoumax": {"header":"inttypes.h"}, "strxfrm": {"header":"string.h"}, "swprintf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["swprintf_s", "sprintf_s"]}}, - "swprintf_s": {"header":"wchar.h", "notes":{"variadic":true}}, + "swprintf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix":true}}, "swscanf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["swscanf_s", "sscanf_s"]}}, - "swscanf_s": {"header":"wchar.h", "notes":{"variadic":true}}, + "swscanf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix":true}}, "system": {"header":"stdlib.h"}, "tan": {"header":"math.h"}, "tanf": {"header":"math.h"}, @@ -493,20 +495,20 @@ "tgamma": {"header":"math.h"}, "tgammaf": {"header":"math.h"}, "tgammal": {"header":"math.h"}, - "thrd_create": {"header":"threads.h"}, - "thrd_current": {"header":"threads.h"}, - "thrd_detach": {"header":"threads.h"}, - "thrd_equal": {"header":"threads.h"}, - "thrd_exit": {"header":"threads.h"}, - "thrd_join": {"header":"threads.h"}, - "thrd_sleep": {"header":"threads.h"}, - "thrd_yield": {"header":"threads.h"}, + "thrd_create": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "thrd_current": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "thrd_detach": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "thrd_equal": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "thrd_exit": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "thrd_join": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "thrd_sleep": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "thrd_yield": {"header":"threads.h", "notes":{"not-in-posix":true}}, "time": {"header":"time.h"}, - "timespec_get": {"header":"time.h"}, + "timespec_get": {"header":"time.h", "notes":{"not-in-posix":true}}, "tmpfile": {"header":"stdio.h", "notes":{"safer-alts":["tmpfile_s"]}}, - "tmpfile_s": {"header":"stdio.h"}, + "tmpfile_s": {"header":"stdio.h", "notes":{"not-in-posix":true}}, "tmpnam": {"header":"stdio.h", "notes":{"safer-alts":["tmpnam_s"]}}, - "tmpnam_s": {"header":"stdio.h"}, + "tmpnam_s": {"header":"stdio.h", "notes":{"not-in-posix":true}}, "tolower": {"header":"ctype.h"}, "toupper": {"header":"ctype.h"}, "towctrans": {"header":"wctype.h"}, @@ -515,96 +517,96 @@ "trunc": {"header":"math.h"}, "truncf": {"header":"math.h"}, "truncl": {"header":"math.h"}, - "tss_create": {"header":"threads.h"}, - "tss_delete": {"header":"threads.h"}, - "tss_get": {"header":"threads.h"}, - "tss_set": {"header":"threads.h"}, + "tss_create": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "tss_delete": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "tss_get": {"header":"threads.h", "notes":{"not-in-posix":true}}, + "tss_set": {"header":"threads.h", "notes":{"not-in-posix":true}}, "ungetc": {"header":"stdio.h"}, "ungetwc": {"header":"wchar.h"}, - "va_arg": {"header":"stdarg.h"}, - "va_copy": {"header":"stdarg.h"}, - "va_end": {"header":"stdarg.h"}, - "va_start": {"header":"stdarg.h"}, + "va_arg": {"header":"stdarg.h", "notes":{"macro":true}}, + "va_copy": {"header":"stdarg.h", "notes":{"macro":true}}, + "va_end": {"header":"stdarg.h", "notes":{"macro":true}}, + "va_start": {"header":"stdarg.h", "notes":{"macro":true}}, "vfprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vfprintf_s"]}}, - "vfprintf_s": {"header":"stdio.h", "notes":{"variadic":true}}, + "vfprintf_s": {"header":"stdio.h", "notes":{"variadic":true, "not-in-posix":true}}, "vfscanf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vfscanf_s"]}}, - "vfscanf_s": {"header":"stdio.h", "notes":{"variadic":true}}, + "vfscanf_s": {"header":"stdio.h", "notes":{"variadic":true, "not-in-posix":true}}, "vfwprintf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["vfwprintf_s"]}}, - "vfwprintf_s": {"header":"wchar.h", "notes":{"variadic":true}}, + "vfwprintf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix":true}}, "vfwscanf": {"header":"wchar.h", "notes":{"variadic":true}, "notes":{"safer-alts":["vfwscanf_s"]}}, - "vfwscanf_s": {"header":"wchar.h", "notes":{"variadic":true}}, + "vfwscanf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix":true}}, "vprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vprintf_s"]}}, - "vprintf_s": {"header":"stdio.h", "notes":{"variadic":true}}, + "vprintf_s": {"header":"stdio.h", "notes":{"variadic":true, "not-in-posix":true}}, "vscanf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vscanf_s"]}}, - "vscanf_s": {"header":"stdio.h", "notes":{"variadic":true}}, + "vscanf_s": {"header":"stdio.h", "notes":{"variadic":true, "not-in-posix":true}}, "vsnprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vsnprintf_s"]}}, - "vsnprintf_s": {"header":"stdio.h", "notes":{"variadic":true}}, - "vsnwprintf_s": {"header":"wchar.h", "notes":{"variadic":true}}, + "vsnprintf_s": {"header":"stdio.h", "notes":{"variadic":true, "not-in-posix":true}}, + "vsnwprintf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix":true}}, "vsprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vsprintf_s", "sprintf_s"]}}, - "vsprintf_s": {"header":"stdio.h", "notes":{"variadic":true}}, + "vsprintf_s": {"header":"stdio.h", "notes":{"variadic":true, "not-in-posix":true}}, "vsscanf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vsscanf_s"]}}, - "vsscanf_s": {"header":"stdio.h", "notes":{"variadic":true}}, + "vsscanf_s": {"header":"stdio.h", "notes":{"variadic":true, "not-in-posix":true}}, "vswprintf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["vswprintf_s", "sprintf_s"]}}, - "vswprintf_s": {"header":"wchar.h", "notes":{"variadic":true}}, + "vswprintf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix":true}}, "vswscanf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["vswscanf_s"]}}, - "vswscanf_s": {"header":"wchar.h", "notes":{"variadic":true}}, + "vswscanf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix":true}}, "vwprintf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["vwprintf_s"]}}, - "vwprintf_s": {"header":"wchar.h", "notes":{"variadic":true}}, + "vwprintf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix":true}}, "vwscanf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["vwscanf_s"]}}, - "vwscanf_s": {"header":"wchar.h", "notes":{"variadic":true}}, + "vwscanf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix":true}}, "wcrtomb": {"header":"wchar.h", "notes":{"safer-alts":["wcrtomb_s"]}}, - "wcrtomb_s": {"header":"wchar.h"}, + "wcrtomb_s": {"header":"wchar.h", "notes":{"not-in-posix":true}}, "wcscat": {"header":"wchar.h", "notes":{"safer-alts":["wcscat_s", "strcat_s"]}}, - "wcscat_s": {"header":"wchar.h"}, + "wcscat_s": {"header":"wchar.h", "notes":{"not-in-posix":true}}, "wcschr": {"header":"wchar.h"}, "wcscmp": {"header":"wchar.h"}, "wcscoll": {"header":"wchar.h"}, "wcscpy": {"header":"wchar.h", "notes":{"safer-alts":["wcscpy_s", "strcpy_s"]}}, - "wcscpy_s": {"header":"wchar.h"}, + "wcscpy_s": {"header":"wchar.h", "notes":{"not-in-posix":true}}, "wcscspn": {"header":"wchar.h"}, "wcsftime": {"header":"wchar.h"}, "wcslen": {"header":"wchar.h", "notes":{"safer-alts":["wcsnlen_s"]}}, "wcsncat": {"header":"wchar.h", "notes":{"safer-alts":["wcsncat_s", "strncat_s", "strlcat"]}}, - "wcsncat_s": {"header":"wchar.h"}, + "wcsncat_s": {"header":"wchar.h", "notes":{"not-in-posix":true}}, "wcsncmp": {"header":"wchar.h"}, "wcsncpy": {"header":"wchar.h", "notes":{"safer-alts":["wcsncpy_s", "strncpy_s", "strlcpy"]}}, - "wcsncpy_s": {"header":"wchar.h"}, - "wcsnlen_s": {"header":"wchar.h"}, + "wcsncpy_s": {"header":"wchar.h", "notes":{"not-in-posix":true}}, + "wcsnlen_s": {"header":"wchar.h", "notes":{"not-in-posix":true}}, "wcspbrk": {"header":"wchar.h"}, "wcsrchr": {"header":"wchar.h"}, "wcsrtombs": {"header":"wchar.h", "notes":{"safer-alts":["wcsrtombs_s"]}}, - "wcsrtombs_s": {"header":"wchar.h"}, + "wcsrtombs_s": {"header":"wchar.h", "notes":{"not-in-posix":true}}, "wcsspn": {"header":"wchar.h"}, "wcsstr": {"header":"wchar.h"}, "wcstod": {"header":"wchar.h"}, "wcstof": {"header":"wchar.h"}, "wcstoimax": {"header":"inttypes.h"}, "wcstok": {"header":"wchar.h", "notes":{"safer-alts":["wcstok_s"]}}, - "wcstok_s": {"header":"wchar.h"}, + "wcstok_s": {"header":"wchar.h", "notes":{"not-in-posix":true}}, "wcstol": {"header":"wchar.h"}, "wcstold": {"header":"wchar.h"}, "wcstoll": {"header":"wchar.h"}, "wcstombs": {"header":"stdlib.h", "notes":{"safer-alts":["wcstombs_s"]}}, - "wcstombs_s": {"header":"stdlib.h"}, + "wcstombs_s": {"header":"stdlib.h", "notes":{"not-in-posix":true}}, "wcstoul": {"header":"wchar.h"}, "wcstoull": {"header":"wchar.h"}, "wcstoumax": {"header":"inttypes.h"}, "wcsxfrm": {"header":"wchar.h"}, "wctob": {"header":"wchar.h"}, "wctomb": {"header":"stdlib.h", "notes":{"safer-alts":["wctomb_s"]}}, - "wctomb_s": {"header":"stdlib.h"}, + "wctomb_s": {"header":"stdlib.h", "notes":{"not-in-posix":true}}, "wctrans": {"header":"wctype.h"}, "wctype": {"header":"wctype.h"}, "wmemchr": {"header":"wchar.h"}, "wmemcmp": {"header":"wchar.h"}, "wmemcpy": {"header":"wchar.h", "notes":{"safer-alts":["wmemcpy_s"]}}, - "wmemcpy_s": {"header":"wchar.h"}, + "wmemcpy_s": {"header":"wchar.h", "notes":{"not-in-posix":true}}, "wmemmove": {"header":"wchar.h", "notes":{"safer-alts":["wmemmove_s"]}}, - "wmemmove_s": {"header":"wchar.h"}, + "wmemmove_s": {"header":"wchar.h", "notes":{"not-in-posix":true}}, "wmemset": {"header":"wchar.h"}, "wprintf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["wprintf_s"]}}, - "wprintf_s": {"header":"wchar.h", "notes":{"variadic":true}}, + "wprintf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix":true}}, "wscanf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["wscanf_s", "sscanf_s"]}}, - "wscanf_s": {"header":"wchar.h", "notes":{"variadic":true}} + "wscanf_s": {"header":"wchar.h", "notes":{"variadic":true, "not-in-posix":true}} } } diff --git a/share/compliance/glibc_functions.json b/share/compliance/glibc_functions.json index 90906ec100ed106e7d0f3f9e736e19e5a95d9463..78d75c937569c6439fadcf89f29abebc545e2bfb 100644 --- a/share/compliance/glibc_functions.json +++ b/share/compliance/glibc_functions.json @@ -929,6 +929,7 @@ "mkfifo", "mknod", "mkstemp", + "mkstemps", "mktemp", "mktime", "mlock", diff --git a/share/compliance/posix_identifiers.json b/share/compliance/posix_identifiers.json index 43bceeac2d67a5b4f1ecac3776462123b4d064ba..b4badf4cb0004a8ee1a6cfd547a27f9981c0aac8 100644 --- a/share/compliance/posix_identifiers.json +++ b/share/compliance/posix_identifiers.json @@ -7,115 +7,130 @@ "variadic-plugin":"This is a variadic function known by the Variadic plug-in, which can (in some cases) generate a specification for it." }, "id_types":[ + {"type":"constant", "description":"symbolic constant"}, + {"type":"field", "description":"field of a struct, union or enum"}, {"type":"function", "description":"declared as a function; may also be defined as a macro"}, - {"type":"variable", "description":"external variable"}, {"type":"macroOrIdentifier", "description":"declaration or definition; unspecified whether it is a macro or an identifier declared with external linkage"}, {"type":"macro", "description":"macro"}, - {"type":"constant", "description":"symbolic constant"}, - {"type":"type", "description":"type or structure"} + {"type":"pragma", "description":"preprocessing pragma directive"}, + {"type":"reserved_name", "description":"name reserved by POSIX"}, + {"type":"type", "description":"type or structure"}, + {"type":"variable", "description":"external variable"} ], "headers":{ - "aio.h": {"fc-support":"none"}, - "arpa/inet.h": {"fc-support":"partial"}, - "assert.h": {"fc-support":"good"}, - "complex.h": {"fc-support":"unsupported"}, - "cpio.h": {"fc-support":"none"}, - "ctype.h": {"fc-support":"good"}, - "dirent.h": {"fc-support":"partial"}, - "dlfcn.h": {"fc-support":"partial"}, - "errno.h": {"fc-support":"good"}, - "fcntl.h": {"fc-support":"partial"}, - "fenv.h": {"fc-support":"partial"}, - "float.h": {"fc-support":"partial"}, - "fmtmsg.h": {"fc-support":"none"}, - "fnmatch.h": {"fc-support":"partial"}, - "ftw.h": {"fc-support":"partial"}, - "glob.h": {"fc-support":"partial"}, - "grp.h": {"fc-support":"partial"}, - "iconv.h": {"fc-support":"partial"}, - "inttypes.h": {"fc-support":"good"}, - "iso646.h": {"fc-support":"good"}, - "langinfo.h": {"fc-support":"none"}, - "libgen.h": {"fc-support":"good"}, - "limits.h": {"fc-support":"good"}, - "locale.h": {"fc-support":"partial"}, - "math.h": {"fc-support":"partial"}, - "monetary.h": {"fc-support":"none"}, - "mqueue.h": {"fc-support":"none"}, - "ndbm.h": {"fc-support":"none"}, - "net/if.h": {"fc-support":"partial"}, - "netdb.h": {"fc-support":"partial"}, - "netinet/in.h": {"fc-support":"partial"}, - "netinet/tcp.h": {"fc-support":"good"}, - "nl_types.h": {"fc-support":"partial"}, - "poll.h": {"fc-support":"good"}, - "pthread.h": {"fc-support":"partial"}, - "pwd.h": {"fc-support":"partial"}, - "regex.h": {"fc-support":"partial"}, - "sched.h": {"fc-support":"partial"}, - "search.h": {"fc-support":"none"}, - "semaphore.h": {"fc-support":"partial"}, - "setjmp.h": {"fc-support":"partial"}, - "signal.h": {"fc-support":"partial"}, - "spawn.h": {"fc-support":"none"}, - "stdarg.h": {"fc-support":"good"}, - "stdbool.h": {"fc-support":"good"}, - "stddef.h": {"fc-support":"good"}, - "stdint.h": {"fc-support":"good"}, - "stdio.h": {"fc-support":"good"}, - "stdlib.h": {"fc-support":"good"}, - "string.h": {"fc-support":"good"}, - "strings.h": {"fc-support":"partial"}, - "stropts.h": {"fc-support":"partial"}, - "sys/ipc.h": {"fc-support":"partial"}, - "sys/mman.h": {"fc-support":"partial"}, - "sys/msg.h": {"fc-support":"none"}, - "sys/resource.h": {"fc-support":"good"}, - "sys/select.h": {"fc-support":"partial"}, - "sys/sem.h": {"fc-support":"none"}, - "sys/shm.h": {"fc-support":"partial"}, - "sys/socket.h": {"fc-support":"partial"}, - "sys/stat.h": {"fc-support":"partial"}, - "sys/statvfs.h": {"fc-support":"none"}, - "sys/time.h": {"fc-support":"partial"}, - "sys/times.h": {"fc-support":"partial"}, - "sys/types.h": {"fc-support":"good"}, - "sys/uio.h": {"fc-support":"partial"}, - "sys/un.h": {"fc-support":"partial"}, - "sys/utsname.h": {"fc-support":"partial"}, - "sys/wait.h": {"fc-support":"partial"}, - "syslog.h": {"fc-support":"partial"}, - "tar.h": {"fc-support":"none"}, - "termios.h": {"fc-support":"partial"}, - "tgmath.h": {"fc-support":"unsupported"}, - "time.h": {"fc-support":"partial"}, - "trace.h": {"fc-support":"none"}, - "ulimit.h": {"fc-support":"none"}, - "unistd.h": {"fc-support":"partial"}, - "utime.h": {"fc-support":"partial"}, - "utmpx.h": {"fc-support":"partial"}, - "wchar.h": {"fc-support":"partial"}, - "wctype.h": {"fc-support":"partial"}, - "wordexp.h": {"fc-support":"none"} + "aio.h": {"fc-support":"none", "extensions":[]}, + "arpa/inet.h": {"fc-support":"partial", "extensions":[]}, + "assert.h": {"fc-support":"good", "extensions":[]}, + "complex.h": {"fc-support":"unsupported", "extensions":[]}, + "cpio.h": {"fc-support":"none", "extensions":[]}, + "ctype.h": {"fc-support":"good", "extensions":[]}, + "dirent.h": {"fc-support":"partial", "extensions":[]}, + "dlfcn.h": {"fc-support":"partial", "extensions":[]}, + "errno.h": {"fc-support":"good", "extensions":[]}, + "fcntl.h": {"fc-support":"partial", "extensions":[]}, + "fenv.h": {"fc-support":"partial", "extensions":[]}, + "float.h": {"fc-support":"partial", "extensions":[]}, + "fmtmsg.h": {"fc-support":"none", "extensions":["XSI"]}, + "fnmatch.h": {"fc-support":"partial", "extensions":[]}, + "ftw.h": {"fc-support":"partial", "extensions":["XSI"]}, + "glob.h": {"fc-support":"partial", "extensions":[]}, + "grp.h": {"fc-support":"partial", "extensions":[]}, + "iconv.h": {"fc-support":"partial", "extensions":[]}, + "inttypes.h": {"fc-support":"good", "extensions":[]}, + "iso646.h": {"fc-support":"good", "extensions":[]}, + "langinfo.h": {"fc-support":"none", "extensions":[]}, + "libgen.h": {"fc-support":"good", "extensions":["XSI"]}, + "limits.h": {"fc-support":"good", "extensions":[]}, + "locale.h": {"fc-support":"partial", "extensions":[]}, + "math.h": {"fc-support":"partial", "extensions":[]}, + "monetary.h": {"fc-support":"none", "extensions":[]}, + "mqueue.h": {"fc-support":"none", "extensions":["MSG"]}, + "ndbm.h": {"fc-support":"none", "extensions":["XSI"]}, + "net/if.h": {"fc-support":"partial", "extensions":[]}, + "netdb.h": {"fc-support":"partial", "extensions":[]}, + "netinet/in.h": {"fc-support":"partial", "extensions":[]}, + "netinet/tcp.h": {"fc-support":"good", "extensions":[]}, + "nl_types.h": {"fc-support":"partial", "extensions":[]}, + "poll.h": {"fc-support":"good", "extensions":[]}, + "pthread.h": {"fc-support":"partial", "extensions":[]}, + "pwd.h": {"fc-support":"partial", "extensions":[]}, + "regex.h": {"fc-support":"partial", "extensions":[]}, + "sched.h": {"fc-support":"partial", "extensions":[]}, + "search.h": {"fc-support":"none", "extensions":["XSI"]}, + "semaphore.h": {"fc-support":"partial", "extensions":[]}, + "setjmp.h": {"fc-support":"partial", "extensions":[]}, + "signal.h": {"fc-support":"partial", "extensions":[]}, + "spawn.h": {"fc-support":"none", "extensions":["SPN"]}, + "stdarg.h": {"fc-support":"good", "extensions":[]}, + "stdbool.h": {"fc-support":"good", "extensions":[]}, + "stddef.h": {"fc-support":"good", "extensions":[]}, + "stdint.h": {"fc-support":"good", "extensions":[]}, + "stdio.h": {"fc-support":"good", "extensions":[]}, + "stdlib.h": {"fc-support":"good", "extensions":[]}, + "string.h": {"fc-support":"good", "extensions":[]}, + "strings.h": {"fc-support":"partial", "extensions":[]}, + "stropts.h": {"fc-support":"partial", "extensions":["OB", "XSR"]}, + "sys/ipc.h": {"fc-support":"partial", "extensions":[]}, + "sys/mman.h": {"fc-support":"partial", "extensions":[]}, + "sys/msg.h": {"fc-support":"none", "extensions":[]}, + "sys/resource.h": {"fc-support":"good", "extensions":[]}, + "sys/select.h": {"fc-support":"partial", "extensions":[]}, + "sys/sem.h": {"fc-support":"none", "extensions":[]}, + "sys/shm.h": {"fc-support":"partial", "extensions":[]}, + "sys/socket.h": {"fc-support":"partial", "extensions":[]}, + "sys/stat.h": {"fc-support":"partial", "extensions":[]}, + "sys/statvfs.h": {"fc-support":"none", "extensions":[]}, + "sys/time.h": {"fc-support":"partial", "extensions":[]}, + "sys/times.h": {"fc-support":"partial", "extensions":[]}, + "sys/types.h": {"fc-support":"good", "extensions":[]}, + "sys/uio.h": {"fc-support":"partial", "extensions":[]}, + "sys/un.h": {"fc-support":"partial", "extensions":[]}, + "sys/utsname.h": {"fc-support":"partial", "extensions":[]}, + "sys/wait.h": {"fc-support":"partial", "extensions":[]}, + "syslog.h": {"fc-support":"partial", "extensions":["XSI"]}, + "tar.h": {"fc-support":"none", "extensions":[]}, + "termios.h": {"fc-support":"partial", "extensions":[]}, + "tgmath.h": {"fc-support":"unsupported", "extensions":[]}, + "time.h": {"fc-support":"partial", "extensions":[]}, + "trace.h": {"fc-support":"none", "extensions":["OB", "TRC"]}, + "ulimit.h": {"fc-support":"none", "extensions":["OB", "XSI"]}, + "unistd.h": {"fc-support":"partial", "extensions":[]}, + "utime.h": {"fc-support":"partial", "extensions":["OB"]}, + "utmpx.h": {"fc-support":"partial", "extensions":["XSI"]}, + "wchar.h": {"fc-support":"partial", "extensions":[]}, + "wctype.h": {"fc-support":"partial", "extensions":[]}, + "wordexp.h": {"fc-support":"none", "extensions":[]} }, "extension_names":{ "ADV":"Advisory Information", + "BE":"Batch Environment Services and Utilities", + "CD":"C-Language Development Utilities", "CX":"Extension to the ISO C standard", + "FD":"FORTRAN Development Utilities", + "FR":"FORTRAN Runtime Utilities", "FSC":"File Synchronization", + "FUT":"Reserved for future usage", "IP6":"IPV6", "MC1":"Non-Robust Mutex Priority Protection or Non-Robust Mutex Priority Inheritance or Robust Mutex Priority Protection or Robust Mutex Priority Inheritance", "ML":"Process Memory Locking", "MLR":"Range Memory Locking", "MON":"Monotonic Clock", + "MSG":"Message Passing", "OB":"Obsolescent", + "PIO":"Prioritized Input and Output", "PS":"Process Scheduling", "REM":"Removed from POSIX.1-2008 (but present in a previous version)", + "RPI":"Robust Mutex Priority Inheritance", "RPP":"Robust Mutex Priority Protection", + "RS":"Raw Sockets", + "SD":"Software Development Utilities", "SHM":"Shared Memory Objects", "SIO":"Synchronized Input and Output", + "SPN":"Spawn", "SS":"Process Sporadic Server", "TCT":"Thread CPU-Time Clocks", "TEF":"Trace Event Filter", + "TPI":"Non-Robust Mutex Priority Inheritance", "TPP":"Non-Robust Mutex Priority Protection", "TPS":"Thread Execution Scheduling", "TRC":"Trace", @@ -126,13 +141,29 @@ "TSP":"Thread Sporadic Server", "TSS":"Thread Stack Size Attribute", "TYM":"Typed Memory Objects", + "UP":"User Portability Utilities", + "UU":"UUCP Utilities", "XSI":"X/Open System Interfaces", "XSR":"XSI STREAMS" }, "data":{ "__bool_true_false_are_defined": {"id_type":"macro", "header":"stdbool.h", "extensions":[]}, + "__loc1": {"id_type":"variable", "header":"libgen.h", "extensions":["REM"]}, "_Complex_I": {"id_type":"macro", "header":"complex.h", "extensions":[]}, "_CS_PATH": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_CS_POSIX_V6_ILP32_OFF32_CFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_CS_POSIX_V6_ILP32_OFF32_LDFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_CS_POSIX_V6_ILP32_OFF32_LIBS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_CS_POSIX_V6_ILP32_OFFBIG_LIBS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_CS_POSIX_V6_LP64_OFF64_CFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_CS_POSIX_V6_LP64_OFF64_LDFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_CS_POSIX_V6_LP64_OFF64_LIBS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_CS_POSIX_V6_LPBIG_OFFBIG_LIBS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_CS_POSIX_V6_WIDTH_RESTRICTED_ENVS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, "_CS_POSIX_V7_ILP32_OFF32_CFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_CS_POSIX_V7_ILP32_OFF32_LDFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_CS_POSIX_V7_ILP32_OFF32_LIBS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, @@ -148,6 +179,7 @@ "_CS_POSIX_V7_THREADS_CFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_CS_POSIX_V7_THREADS_LDFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_CS_POSIX_V7_WIDTH_RESTRICTED_ENVS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_CS_V6_ENV": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, "_CS_V7_ENV": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_Exit": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "_exit": {"id_type":"function", "header":"unistd.h", "extensions":[]}, @@ -156,52 +188,325 @@ "_IOLBF": {"id_type":"macro", "header":"stdio.h", "extensions":[]}, "_IONBF": {"id_type":"macro", "header":"stdio.h", "extensions":[]}, "_longjmp": {"id_type":"function", "header":"setjmp.h", "extensions":["OB","XSI"]}, + "_PC_2_SYMLINKS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_ALLOC_SIZE_MIN": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_ASYNC_IO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_CHOWN_RESTRICTED": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_FILESIZEBITS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_LINK_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_MAX_CANON": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_MAX_INPUT": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_NAME_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_NO_TRUNC": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_PATH_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_PIPE_BUF": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_PRIO_IO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_REC_INCR_XFER_SIZE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_REC_MAX_XFER_SIZE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_REC_MIN_XFER_SIZE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_REC_XFER_ALIGN": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_SYMLINK_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_SYNC_IO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_TIMESTAMP_RESOLUTION": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_PC_VDISABLE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX2_BC_BASE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX2_BC_DIM_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX2_BC_SCALE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX2_BC_STRING_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX2_C_BIND": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX2_C_DEV": {"id_type":"constant", "header":"unistd.h", "extensions":["CD"]}, + "_POSIX2_C_VERSION": {"id_type":"constant", "header":"unistd.h", "extensions":["REM"]}, + "_POSIX2_CHAR_TERM": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX2_CHARCLASS_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX2_COLL_WEIGHTS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX2_EXPR_NEST_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX2_FORT_DEV": {"id_type":"constant", "header":"unistd.h", "extensions":["FD"]}, + "_POSIX2_FORT_RUN": {"id_type":"constant", "header":"unistd.h", "extensions":["FR"]}, + "_POSIX2_LINE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX2_LOCALEDEF": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX2_PBS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB", "BE"]}, + "_POSIX2_PBS_ACCOUNTING": {"id_type":"constant", "header":"unistd.h", "extensions":["OB", "BE"]}, + "_POSIX2_PBS_CHECKPOINT": {"id_type":"constant", "header":"unistd.h", "extensions":["OB", "BE"]}, + "_POSIX2_PBS_LOCATE": {"id_type":"constant", "header":"unistd.h", "extensions":["OB", "BE"]}, + "_POSIX2_PBS_MESSAGE": {"id_type":"constant", "header":"unistd.h", "extensions":["OB", "BE"]}, + "_POSIX2_PBS_TRACK": {"id_type":"constant", "header":"unistd.h", "extensions":["OB", "BE"]}, + "_POSIX2_RE_DUP_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX2_SW_DEV": {"id_type":"constant", "header":"unistd.h", "extensions":["SD"]}, + "_POSIX2_SYMLINKS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX2_UPE": {"id_type":"constant", "header":"unistd.h", "extensions":["UP"]}, "_POSIX2_VERSION": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_ADVISORY_INFO": {"id_type":"constant", "header":"unistd.h", "extensions":["ADV"]}, "_POSIX_AIO_LISTIO_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_AIO_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_ARG_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_ASYNC_IO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_ASYNCHRONOUS_IO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_BARRIERS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_CHILD_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_CHOWN_RESTRICTED": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_CLOCK_SELECTION": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_CLOCKRES_MIN": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_CPUTIME": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_DELAYTIMER_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_FSYNC": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_HOST_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_IPV6": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_JOB_CONTROL": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_LINK_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_LOGIN_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_MAPPED_FILES": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_MAX_CANON": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_MAX_INPUT": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_MEMLOCK": {"id_type":"constant", "header":"unistd.h", "extensions":["ML"]}, + "_POSIX_MEMLOCK_RANGE": {"id_type":"constant", "header":"unistd.h", "extensions":["MLR"]}, + "_POSIX_MEMORY_PROTECTION": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_MESSAGE_PASSING": {"id_type":"constant", "header":"unistd.h", "extensions":["MSG"]}, + "_POSIX_MONOTONIC_CLOCK": {"id_type":"constant", "header":"unistd.h", "extensions":["MON"]}, "_POSIX_MQ_OPEN_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_MQ_PRIO_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_NGROUPS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_NO_TRUNC": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_OPEN_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_PATH_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_PIPE_BUF": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_PRIO_IO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_PRIORITIZED_IO": {"id_type":"constant", "header":"unistd.h", "extensions":["PIO"]}, + "_POSIX_PRIORITY_SCHEDULING": {"id_type":"constant", "header":"unistd.h", "extensions":["PS"]}, + "_POSIX_RAW_SOCKETS": {"id_type":"constant", "header":"unistd.h", "extensions":["RS"]}, "_POSIX_RE_DUP_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_READER_WRITER_LOCKS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_REALTIME_SIGNALS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_REGEXP": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_RTSIG_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_SAVED_IDS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_SEM_NSEMS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_SEM_VALUE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_SEMAPHORES": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_SHARED_MEMORY_OBJECTS": {"id_type":"constant", "header":"unistd.h", "extensions":["SHM"]}, + "_POSIX_SHELL": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_SIGQUEUE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_SPAWN": {"id_type":"constant", "header":"unistd.h", "extensions":["SPN"]}, + "_POSIX_SPIN_LOCKS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_SPORADIC_SERVER": {"id_type":"constant", "header":"unistd.h", "extensions":["SS"]}, "_POSIX_SS_REPL_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_SSIZE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_STREAM_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_SUBPROFILE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_SYMLINK_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_SYMLOOP_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_SYNC_IO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_SYNCHRONIZED_IO": {"id_type":"constant", "header":"unistd.h", "extensions":["SIO"]}, + "_POSIX_THREAD_ATTR_STACKADDR": {"id_type":"constant", "header":"unistd.h", "extensions":["TSA"]}, + "_POSIX_THREAD_ATTR_STACKSIZE": {"id_type":"constant", "header":"unistd.h", "extensions":["TSS"]}, + "_POSIX_THREAD_CPUTIME": {"id_type":"constant", "header":"unistd.h", "extensions":["TCT"]}, "_POSIX_THREAD_DESTRUCTOR_ITERATIONS": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_THREAD_KEYS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_THREAD_PRIO_INHERIT": {"id_type":"constant", "header":"unistd.h", "extensions":["TPI"]}, + "_POSIX_THREAD_PRIO_PROTECT": {"id_type":"constant", "header":"unistd.h", "extensions":["TPP"]}, + "_POSIX_THREAD_PRIORITY_SCHEDULING": {"id_type":"constant", "header":"unistd.h", "extensions":["TPS"]}, + "_POSIX_THREAD_PROCESS_SHARED": {"id_type":"constant", "header":"unistd.h", "extensions":["TSH"]}, + "_POSIX_THREAD_ROBUST_PRIO_INHERIT": {"id_type":"constant", "header":"unistd.h", "extensions":["RPI"]}, + "_POSIX_THREAD_ROBUST_PRIO_PROTECT": {"id_type":"constant", "header":"unistd.h", "extensions":["RPP"]}, + "_POSIX_THREAD_SAFE_FUNCTIONS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_THREAD_SPORADIC_SERVER": {"id_type":"constant", "header":"unistd.h", "extensions":["TSP"]}, "_POSIX_THREAD_THREADS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_THREADS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_TIMEOUTS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_TIMER_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_TIMERS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_TIMESTAMP_RESOLUTION": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_TRACE": {"id_type":"constant", "header":"unistd.h", "extensions":["OB", "TRC"]}, + "_POSIX_TRACE_EVENT_FILTER": {"id_type":"constant", "header":"unistd.h", "extensions":["OB", "TEF"]}, "_POSIX_TRACE_EVENT_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_TRACE_INHERIT": {"id_type":"constant", "header":"unistd.h", "extensions":["OB", "TRI"]}, + "_POSIX_TRACE_LOG": {"id_type":"constant", "header":"unistd.h", "extensions":["OB", "TRL"]}, "_POSIX_TRACE_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_TRACE_SYS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_TRACE_USER_EVENT_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "_POSIX_TTY_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_TYPED_MEMORY_OBJECTS": {"id_type":"constant", "header":"unistd.h", "extensions":["TYM"]}, "_POSIX_TZNAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "_POSIX_V6_ILP32_OFF32": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_POSIX_V6_ILP32_OFFBIG": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_POSIX_V6_LP64_OFF64": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_POSIX_V6_LPBIG_OFFBIG": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_POSIX_V7_ILP32_OFF32": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_POSIX_V7_ILP32_OFFBIG": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_V7_LP64_OFF64": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_POSIX_V7_LPBIG_OFFBIG": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_VDISABLE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "_POSIX_VERSION": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_C_BIND": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_C_DEV": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_C_VERSION": {"id_type":"constant", "header":"unistd.h", "extensions":["REM"]}, + "_SC_2_CHAR_TERM": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_FORT_DEV": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_FORT_RUN": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_LOCALEDEF": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_PBS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_PBS_ACCOUNTING": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_PBS_CHECKPOINT": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_PBS_LOCATE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_PBS_MESSAGE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_PBS_TRACK": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_SW_DEV": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_UPE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_2_VERSION": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_ADVISORY_INFO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_AIO_LISTIO_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_AIO_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_AIO_PRIO_DELTA_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_ARG_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_ASYNCHRONOUS_IO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_ATEXIT_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_BARRIERS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_BC_BASE_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_BC_DIM_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_BC_SCALE_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_BC_STRING_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_CHILD_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_CLK_TCK": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_CLOCK_SELECTION": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_COLL_WEIGHTS_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_CPUTIME": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_DELAYTIMER_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_EXPR_NEST_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_FILE_LOCKING": {"id_type":"constant", "header":"unistd.h", "extensions":["REM"]}, + "_SC_FSYNC": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_GETGR_R_SIZE_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_GETPW_R_SIZE_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_HOST_NAME_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_IOV_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_IPV6": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_JOB_CONTROL": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_LINE_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_LOGIN_NAME_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_MAPPED_FILES": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_MEMLOCK": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_MEMLOCK_RANGE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_MEMORY_PROTECTION": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_MESSAGE_PASSING": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_MONOTONIC_CLOCK": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_MQ_OPEN_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_MQ_PRIO_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_NGROUPS_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_OPEN_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_PAGE_SIZE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_PAGESIZE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_PASS_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":["REM"]}, + "_SC_POSIX_THREADS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_PRIORITIZED_IO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_PRIORITY_SCHEDULING": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_RAW_SOCKETS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_RE_DUP_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_READER_WRITER_LOCKS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_REALTIME_SIGNALS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_REGEXP": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_RTSIG_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SAVED_IDS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SEM_NSEMS_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SEM_VALUE_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SEMAPHORES": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SHARED_MEMORY_OBJECTS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SHELL": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SIGQUEUE_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SPAWN": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SPIN_LOCKS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SPORADIC_SERVER": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SS_REPL_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_STREAM_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SYMLOOP_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_SYNCHRONIZED_IO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_ATTR_STACKADDR": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_ATTR_STACKSIZE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_CPUTIME": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_DESTRUCTOR_ITERATIONS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_KEYS_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_PRIO_INHERIT": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_PRIO_PROTECT": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_PRIORITY_SCHEDULING": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_PROCESS_SHARED": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_ROBUST_PRIO_INHERIT": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_ROBUST_PRIO_PROTECT": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_SAFE_FUNCTIONS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_SPORADIC_SERVER": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_STACK_MIN": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREAD_THREADS_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_THREADS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TIMEOUTS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TIMER_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TIMERS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TRACE": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TRACE_EVENT_FILTER": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TRACE_EVENT_NAME_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TRACE_INHERIT": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TRACE_LOG": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TRACE_NAME_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TRACE_SYS_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TRACE_USER_EVENT_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TTY_NAME_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TYPED_MEMORY_OBJECTS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_TZNAME_MAX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_V6_ILP32_OFF32": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_SC_V6_ILP32_OFFBIG": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_SC_V6_LP64_OFF64": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_SC_V6_LPBIG_OFFBIG": {"id_type":"constant", "header":"unistd.h", "extensions":["OB"]}, + "_SC_V7_ILP32_OFF32": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_V7_ILP32_OFFBIG": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_V7_LP64_OFF64": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_V7_LPBIG_OFFBIG": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_VERSION": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_XOPEN_CRYPT": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_XOPEN_ENH_I18N": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_XOPEN_LEGACY": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_XOPEN_REALTIME": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_XOPEN_REALTIME_THREADS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_XOPEN_SHM": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_XOPEN_STREAMS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_XOPEN_UNIX": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_XOPEN_UUCP": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_XOPEN_VERSION": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_SC_XOPEN_XCU_VERSION": {"id_type":"constant", "header":"unistd.h", "extensions":["REM"]}, "_setjmp": {"id_type":"function", "header":"setjmp.h", "extensions":["OB","XSI"]}, "_tolower": {"id_type":"function", "header":"ctype.h", "extensions":["OB","XSI"]}, "_toupper": {"id_type":"function", "header":"ctype.h", "extensions":["OB","XSI"]}, + "_V6_ILP32_OFF32": {"id_type":"constant", "header":"unistd.h", "extensions":["REM"]}, + "_V6_ILP32_OFFBIG": {"id_type":"constant", "header":"unistd.h", "extensions":["REM"]}, + "_V6_LP64_OFF64": {"id_type":"constant", "header":"unistd.h", "extensions":["REM"]}, + "_V6_LPBIG_OFFBIG": {"id_type":"constant", "header":"unistd.h", "extensions":["REM"]}, + "_XOPEN_CRYPT": {"id_type":"constant", "header":"unistd.h", "extensions":["XSI"]}, + "_XOPEN_ENH_I18N": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_XOPEN_IOV_MAX": {"id_type":"constant", "header":"limits.h", "extensions":["XSI"]}, + "_XOPEN_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":["XSI"]}, + "_XOPEN_PATH_MAX": {"id_type":"constant", "header":"limits.h", "extensions":["XSI"]}, + "_XOPEN_REALTIME": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_XOPEN_REALTIME_THREADS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_XOPEN_SHM": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "_XOPEN_STREAMS": {"id_type":"constant", "header":"unistd.h", "extensions":["OB", "XSR"]}, + "_XOPEN_UNIX": {"id_type":"constant", "header":"unistd.h", "extensions":["XSI"]}, + "_XOPEN_UUCP": {"id_type":"constant", "header":"unistd.h", "extensions":["UU"]}, "_XOPEN_VERSION": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "a64l": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, + "ABDAY_1": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABDAY_2": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABDAY_3": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABDAY_4": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABDAY_5": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABDAY_6": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABDAY_7": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABMON_1": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABMON_10": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABMON_11": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABMON_12": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABMON_2": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABMON_3": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABMON_4": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABMON_5": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABMON_6": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABMON_7": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABMON_8": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ABMON_9": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, "abort": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "abs": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "accept": {"id_type":"function", "header":"sys/socket.h", "extensions":["XSI"]}, @@ -212,35 +517,60 @@ "acoshf": {"id_type":"function", "header":"math.h", "extensions":[]}, "acoshl": {"id_type":"function", "header":"math.h", "extensions":[]}, "acosl": {"id_type":"function", "header":"math.h", "extensions":[]}, + "actime": {"id_type":"field", "header":"utime.h", "extensions":[]}, + "ACTION": {"id_type":"type", "header":"search.h", "extensions":[]}, "addrinfo": {"id_type":"type", "header":"netdb.h", "extensions":[]}, - "AF_INET": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, + "AF_INET": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, "AF_INET6": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "AF_UNIX": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "AF_UNSPEC": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, + "AF_UNIX": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "AF_UNSPEC": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "ai_addr": {"id_type":"field", "header":"netdb.h", "extensions":[]}, "AI_ADDRCONFIG": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, + "ai_addrlen": {"id_type":"field", "header":"netdb.h", "extensions":[]}, "AI_ALL": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, "AI_CANONNAME": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, + "ai_canonname": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "ai_family": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "ai_flags": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "ai_next": {"id_type":"field", "header":"netdb.h", "extensions":[]}, "AI_NUMERICHOST": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, "AI_NUMERICSERV": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, "AI_PASSIVE": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, + "ai_protocol": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "ai_socktype": {"id_type":"field", "header":"netdb.h", "extensions":[]}, "AI_V4MAPPED": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, "AIO_ALLDONE": {"id_type":"constant", "header":"aio.h", "extensions":[]}, + "aio_buf": {"id_type":"field", "header":"aio.h", "extensions":[]}, "aio_cancel": {"id_type":"function", "header":"aio.h", "extensions":[]}, "AIO_CANCELED": {"id_type":"constant", "header":"aio.h", "extensions":[]}, "aio_error": {"id_type":"function", "header":"aio.h", "extensions":[]}, + "aio_fildes": {"id_type":"field", "header":"aio.h", "extensions":[]}, "aio_fsync": {"id_type":"function", "header":"aio.h", "extensions":["FSC","SIO"]}, + "aio_lio_opcode": {"id_type":"field", "header":"aio.h", "extensions":[]}, + "AIO_LISTIO_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "AIO_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "aio_nbytes": {"id_type":"field", "header":"aio.h", "extensions":[]}, "AIO_NOTCANCELED": {"id_type":"constant", "header":"aio.h", "extensions":[]}, + "aio_offset": {"id_type":"field", "header":"aio.h", "extensions":[]}, + "AIO_PRIO_DELTA_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "aio_read": {"id_type":"function", "header":"aio.h", "extensions":[]}, + "aio_reqprio": {"id_type":"field", "header":"aio.h", "extensions":[]}, "aio_return": {"id_type":"function", "header":"aio.h", "extensions":[]}, + "aio_sigevent": {"id_type":"field", "header":"aio.h", "extensions":[]}, "aio_suspend": {"id_type":"function", "header":"aio.h", "extensions":[]}, "aio_write": {"id_type":"function", "header":"aio.h", "extensions":[]}, "aiocb": {"id_type":"type", "header":"aio.h", "extensions":["FSC","SIO"]}, "alarm": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "alphasort": {"id_type":"function", "header":"dirent.h", "extensions":[]}, + "ALT_DIGITS": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "AM_STR": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, "and": {"id_type":"macro", "header":"iso646.h", "extensions":["CX"]}, "and_eq": {"id_type":"macro", "header":"iso646.h", "extensions":[]}, - "asctime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "asctime_r": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "ANYMARK": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "AREGTYPE": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "ARG_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "asctime": {"id_type":"function", "header":"time.h", "extensions":[]}, + "asctime_r": {"id_type":"function", "header":"time.h", "extensions":[]}, "asin": {"id_type":"function", "header":"math.h", "extensions":[]}, "asinf": {"id_type":"function", "header":"math.h", "extensions":[]}, "asinh": {"id_type":"function", "header":"math.h", "extensions":[]}, @@ -263,6 +593,7 @@ "atanhl": {"id_type":"function", "header":"math.h", "extensions":[]}, "atanl": {"id_type":"function", "header":"math.h", "extensions":[]}, "atexit": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, + "ATEXIT_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "atof": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "atoi": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "atol": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, @@ -285,18 +616,61 @@ "B9600": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "bandinfo": {"id_type":"type", "header":"stropts.h", "extensions":[]}, "basename": {"id_type":"function", "header":"libgen.h", "extensions":[]}, - "bind": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, + "BC_BASE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "BC_DIM_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "BC_SCALE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "BC_STRING_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "bcmp": {"id_type":"function", "header":"strings.h", "extensions":["REM"]}, + "bcopy": {"id_type":"function", "header":"strings.h", "extensions":["REM"]}, + "bi_flag": {"id_type":"field", "header":"stropts.h", "extensions":[]}, + "bi_pri": {"id_type":"field", "header":"stropts.h", "extensions":[]}, + "bind": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, "bitand": {"id_type":"macro", "header":"iso646.h", "extensions":[]}, "bitor": {"id_type":"macro", "header":"iso646.h", "extensions":[]}, "blkcnt_t": {"id_type":"type", "header":"sys/types.h", "extensions":["XSI"]}, "blksize_t": {"id_type":"type", "header":"sys/types.h", "extensions":["XSI"]}, + "BLKTYPE": {"id_type":"constant", "header":"tar.h", "extensions":[]}, "bool": {"id_type":"macro", "header":"stdbool.h", "extensions":[]}, "BOOT_TIME": {"id_type":"constant", "header":"utmpx.h", "extensions":[]}, + "brk": {"id_type":"function", "header":"unistd.h", "extensions":["REM"]}, "BRKINT": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "BS0": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, + "BS1": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, "BSDLY": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "bsearch": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "btowc": {"id_type":"function", "header":"wchar.h", "extensions":[]}, + "buf": {"id_type":"field", "header":"stropts.h", "extensions":[]}, "BUFSIZ": {"id_type":"type", "header":"stdio.h", "extensions":[]}, + "BUS_ADRALN": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "BUS_ADRERR": {"id_type":"constant", "header":"signal.h", "extensions":[]}, + "BUS_OBJERR": {"id_type":"constant", "header":"signal.h", "extensions":[]}, + "bzero": {"id_type":"function", "header":"strings.h", "extensions":["REM"]}, + "c_cc": {"id_type":"field", "header":"termios.h", "extensions":[]}, + "c_cflag": {"id_type":"field", "header":"termios.h", "extensions":[]}, + "c_iflag": {"id_type":"field", "header":"termios.h", "extensions":[]}, + "C_IRGRP": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_IROTH": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_IRUSR": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_ISBLK": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_ISCHR": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_ISCTG": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_ISDIR": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_ISFIFO": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_ISGID": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_ISLNK": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_ISREG": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_ISSOCK": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_ISUID": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_ISVTX": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_IWGRP": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_IWOTH": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_IWUSR": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_IXGRP": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_IXOTH": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "C_IXUSR": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, + "c_lflag": {"id_type":"field", "header":"termios.h", "extensions":[]}, + "c_mode": {"id_type":"field", "header":"cpio.h", "extensions":[]}, + "c_oflag": {"id_type":"field", "header":"termios.h", "extensions":[]}, "cabs": {"id_type":"function", "header":"complex.h", "extensions":[]}, "cabsf": {"id_type":"function", "header":"complex.h", "extensions":[]}, "cabsl": {"id_type":"function", "header":"complex.h", "extensions":[]}, @@ -325,6 +699,7 @@ "catclose": {"id_type":"function", "header":"nl_types.h", "extensions":[]}, "catgets": {"id_type":"function", "header":"nl_types.h", "extensions":[]}, "catopen": {"id_type":"function", "header":"nl_types.h", "extensions":[]}, + "CBAUD": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, "cbrt": {"id_type":"function", "header":"math.h", "extensions":[]}, "cbrtf": {"id_type":"function", "header":"math.h", "extensions":[]}, "cbrtl": {"id_type":"function", "header":"math.h", "extensions":[]}, @@ -338,55 +713,96 @@ "ceil": {"id_type":"function", "header":"math.h", "extensions":[]}, "ceilf": {"id_type":"function", "header":"math.h", "extensions":[]}, "ceill": {"id_type":"function", "header":"math.h", "extensions":[]}, + "cerf": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "cerfc": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "cerfcf": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "cerfcl": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "cerff": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "cerfl": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, "cexp": {"id_type":"function", "header":"complex.h", "extensions":[]}, + "cexp2": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "cexp2f": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "cexp2l": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, "cexpf": {"id_type":"function", "header":"complex.h", "extensions":[]}, "cexpl": {"id_type":"function", "header":"complex.h", "extensions":[]}, + "cexpm1": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "cexpm1f": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "cexpm1l": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, "cfgetispeed": {"id_type":"function", "header":"termios.h", "extensions":[]}, "cfgetospeed": {"id_type":"function", "header":"termios.h", "extensions":[]}, "cfsetispeed": {"id_type":"function", "header":"termios.h", "extensions":[]}, "cfsetospeed": {"id_type":"function", "header":"termios.h", "extensions":[]}, + "cgid": {"id_type":"field", "header":"sys/ipc.h", "extensions":[]}, "CHAR_BIT": {"id_type":"macro", "header":"limits.h", "extensions":[]}, "CHAR_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]}, "CHAR_MIN": {"id_type":"macro", "header":"limits.h", "extensions":[]}, + "CHARCLASS_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "chdir": {"id_type":"function", "header":"unistd.h", "extensions":[]}, + "CHILD_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "chmod": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]}, "chown": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "chroot": {"id_type":"function", "header":"unistd.h", "extensions":["OB","REM"]}, + "CHRTYPE": {"id_type":"constant", "header":"tar.h", "extensions":[]}, "cimag": {"id_type":"function", "header":"complex.h", "extensions":[]}, "cimagf": {"id_type":"function", "header":"complex.h", "extensions":[]}, "cimagl": {"id_type":"function", "header":"complex.h", "extensions":[]}, + "CLD_CONTINUED": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "CLD_DUMPED": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "CLD_EXITED": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "CLD_KILLED": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "CLD_STOPPED": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "CLD_TRAPPED": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, "clearerr": {"id_type":"function", "header":"stdio.h", "extensions":[]}, + "clgamma": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "clgammaf": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "clgammal": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "CLK_TCK": {"id_type":"constant", "header":"time.h", "extensions":["REM"]}, "CLOCAL": {"id_type":"constant", "header":"termios.h", "extensions":[]}, - "clock": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "clock_getcpuclockid": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "clock_getres": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "clock_gettime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "clock": {"id_type":"function", "header":"time.h", "extensions":[]}, + "clock_getcpuclockid": {"id_type":"function", "header":"time.h", "extensions":[]}, + "clock_getres": {"id_type":"function", "header":"time.h", "extensions":[]}, + "clock_gettime": {"id_type":"function", "header":"time.h", "extensions":[]}, "CLOCK_MONOTONIC": {"id_type":"macro", "header":"time.h", "extensions":["MON"]}, - "clock_nanosleep": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "CLOCK_PROCESS_CPUTIME_ID": {"id_type":"macro", "header":"time.h", "extensions":["IP6"]}, - "CLOCK_REALTIME": {"id_type":"macro", "header":"time.h", "extensions":["IP6"]}, - "clock_settime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "clock_nanosleep": {"id_type":"function", "header":"time.h", "extensions":[]}, + "CLOCK_PROCESS_CPUTIME_ID": {"id_type":"macro", "header":"time.h", "extensions":[]}, + "CLOCK_REALTIME": {"id_type":"macro", "header":"time.h", "extensions":[]}, + "clock_settime": {"id_type":"function", "header":"time.h", "extensions":[]}, "clock_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, - "CLOCK_THREAD_CPUTIME_ID": {"id_type":"macro", "header":"time.h", "extensions":["IP6"]}, + "CLOCK_THREAD_CPUTIME_ID": {"id_type":"macro", "header":"time.h", "extensions":[]}, "clockid_t": {"id_type":"type", "header":"sys/types.h", "extensions":["TCT"]}, - "CLOCKS_PER_SEC": {"id_type":"macro", "header":"time.h", "extensions":["IP6"]}, + "CLOCKS_PER_SEC": {"id_type":"macro", "header":"time.h", "extensions":[]}, "clog": {"id_type":"function", "header":"complex.h", "extensions":[]}, + "clog10": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "clog10f": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "clog10l": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "clog1p": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "clog1pf": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "clog1pl": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "clog2": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "clog2f": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "clog2l": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, "clogf": {"id_type":"function", "header":"complex.h", "extensions":[]}, "clogl": {"id_type":"function", "header":"complex.h", "extensions":[]}, "close": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "closedir": {"id_type":"function", "header":"dirent.h", "extensions":[]}, "closelog": {"id_type":"function", "header":"syslog.h", "extensions":[]}, - "CMSG_DATA": {"id_type":"macro", "header":"sys/socket.h", "extensions":["IP6"]}, - "CMSG_FIRSTHDR": {"id_type":"macro", "header":"sys/socket.h", "extensions":["IP6"]}, - "CMSG_NXTHDR": {"id_type":"macro", "header":"sys/socket.h", "extensions":["IP6"]}, - "cmsghdr": {"id_type":"type", "header":"sys/socket.h", "extensions":["IP6"]}, + "CMSG_DATA": {"id_type":"macro", "header":"sys/socket.h", "extensions":[]}, + "CMSG_FIRSTHDR": {"id_type":"macro", "header":"sys/socket.h", "extensions":[]}, + "cmsg_len": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "cmsg_level": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "CMSG_NXTHDR": {"id_type":"macro", "header":"sys/socket.h", "extensions":[]}, + "cmsg_type": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "cmsghdr": {"id_type":"type", "header":"sys/socket.h", "extensions":[]}, + "CODESET": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "COLL_WEIGHTS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "compl": {"id_type":"macro", "header":"iso646.h", "extensions":[]}, "complex": {"id_type":"macro", "header":"complex.h", "extensions":[]}, "confstr": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "conj": {"id_type":"function", "header":"complex.h", "extensions":[]}, "conjf": {"id_type":"function", "header":"complex.h", "extensions":[]}, "conjl": {"id_type":"function", "header":"complex.h", "extensions":[]}, - "connect": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, + "connect": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, + "CONTTYPE": {"id_type":"constant", "header":"tar.h", "extensions":[]}, "copysign": {"id_type":"function", "header":"math.h", "extensions":[]}, "copysignf": {"id_type":"function", "header":"math.h", "extensions":[]}, "copysignl": {"id_type":"function", "header":"math.h", "extensions":[]}, @@ -402,13 +818,22 @@ "cproj": {"id_type":"function", "header":"complex.h", "extensions":[]}, "cprojf": {"id_type":"function", "header":"complex.h", "extensions":[]}, "cprojl": {"id_type":"function", "header":"complex.h", "extensions":[]}, + "CR0": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, + "CR1": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, + "CR2": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, + "CR3": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, "CRDLY": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "CREAD": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "creal": {"id_type":"function", "header":"complex.h", "extensions":[]}, "crealf": {"id_type":"function", "header":"complex.h", "extensions":[]}, "creall": {"id_type":"function", "header":"complex.h", "extensions":[]}, "creat": {"id_type":"function", "header":"fcntl.h", "extensions":[]}, + "CRNCYSTR": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, "crypt": {"id_type":"function", "header":"unistd.h", "extensions":[]}, + "CS5": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "CS6": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "CS7": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "CS8": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "csin": {"id_type":"function", "header":"complex.h", "extensions":[]}, "csinf": {"id_type":"function", "header":"complex.h", "extensions":[]}, "csinh": {"id_type":"function", "header":"complex.h", "extensions":[]}, @@ -427,10 +852,38 @@ "ctanhl": {"id_type":"function", "header":"complex.h", "extensions":[]}, "ctanl": {"id_type":"function", "header":"complex.h", "extensions":[]}, "ctermid": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]}, - "ctime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "ctime_r": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "ctgamma": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "ctgammaf": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "ctgammal": {"id_type":"function", "header":"complex.h", "extensions":["FUT"]}, + "ctime": {"id_type":"function", "header":"time.h", "extensions":[]}, + "ctime_r": {"id_type":"function", "header":"time.h", "extensions":[]}, + "ctlbuf": {"id_type":"field", "header":"stropts.h", "extensions":[]}, + "cuid": {"id_type":"field", "header":"sys/ipc.h", "extensions":[]}, + "currency_symbol": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "cuserid": {"id_type":"function", "header":"stdint.h", "extensions":["REM"]}, + "D_FMT": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "d_ino": {"id_type":"field", "header":"dirent.h", "extensions":["XSI"]}, + "d_name": {"id_type":"field", "header":"dirent.h", "extensions":[]}, + "D_T_FMT": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "databuf": {"id_type":"field", "header":"stropts.h", "extensions":[]}, "datum": {"id_type":"type", "header":"ndbm.h", "extensions":[]}, - "daylight": {"id_type":"variable", "header":"time.h", "extensions":["IP6"]}, + "DAY_1": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "DAY_2": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "DAY_3": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "DAY_4": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "DAY_5": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "DAY_6": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "DAY_7": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "daylight": {"id_type":"variable", "header":"time.h", "extensions":[]}, + "DBL_DIG": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "DBL_EPSILON": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "DBL_MANT_DIG": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "DBL_MAX": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "DBL_MAX_10_EXP": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "DBL_MAX_EXP": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "DBL_MIN": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "DBL_MIN_10_EXP": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "DBL_MIN_EXP": {"id_type":"constant", "header":"float.h", "extensions":[]}, "DBM": {"id_type":"type", "header":"ndbm.h", "extensions":[]}, "dbm_clearerr": {"id_type":"function", "header":"ndbm.h", "extensions":[]}, "dbm_close": {"id_type":"function", "header":"ndbm.h", "extensions":[]}, @@ -444,20 +897,28 @@ "DBM_REPLACE": {"id_type":"constant", "header":"ndbm.h", "extensions":[]}, "dbm_store": {"id_type":"function", "header":"ndbm.h", "extensions":[]}, "DEAD_PROCESS": {"id_type":"constant", "header":"utmpx.h", "extensions":[]}, + "DECIMAL_DIG": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "decimal_point": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "DEFECHO": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, + "DELAYTIMER_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "dev_t": {"id_type":"type", "header":"sys/types.h", "extensions":["XSI"]}, - "difftime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "difftime": {"id_type":"function", "header":"time.h", "extensions":[]}, "DIR": {"id_type":"type", "header":"dirent.h", "extensions":[]}, "dirent": {"id_type":"type", "header":"dirent.h", "extensions":[]}, "dirfd": {"id_type":"function", "header":"dirent.h", "extensions":[]}, "dirname": {"id_type":"function", "header":"libgen.h", "extensions":[]}, + "DIRTYPE": {"id_type":"constant", "header":"tar.h", "extensions":[]}, "div": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "div_t": {"id_type":"type", "header":"stdlib.h", "extensions":[]}, "dlclose": {"id_type":"function", "header":"dlfcn.h", "extensions":[]}, "dlerror": {"id_type":"function", "header":"dlfcn.h", "extensions":[]}, "dlopen": {"id_type":"function", "header":"dlfcn.h", "extensions":[]}, "dlsym": {"id_type":"function", "header":"dlfcn.h", "extensions":[]}, + "double_t": {"id_type":"type", "header":"math.h", "extensions":[]}, "dprintf": {"id_type":"function", "header":"stdio.h", "extensions":["CX"], "notes":{"variadic-plugin":true}}, + "dptr": {"id_type":"field", "header":"ndbm.h", "extensions":[]}, "drand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, + "dsize": {"id_type":"field", "header":"ndbm.h", "extensions":[]}, "dup": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "dup2": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "duplocale": {"id_type":"function", "header":"locale.h", "extensions":["CX"]}, @@ -484,12 +945,16 @@ "ECANCELED": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "ECHILD": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "ECHO": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "ECHOCTL": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, "ECHOE": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "ECHOK": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "ECHOKE": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, "ECHONL": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "ECHOPRT": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, "ECONNABORTED": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "ECONNREFUSED": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "ECONNRESET": {"id_type":"macro", "header":"errno.h", "extensions":[]}, + "ecvt": {"id_type":"function", "header":"stdlib.h", "extensions":["REM"]}, "EDEADLK": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "EDESTADDRREQ": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "EDOM": {"id_type":"macro", "header":"errno.h", "extensions":[]}, @@ -517,6 +982,7 @@ "endgrent": {"id_type":"function", "header":"grp.h", "extensions":["XSI"]}, "endhostent": {"id_type":"function", "header":"netdb.h", "extensions":[]}, "endnetent": {"id_type":"function", "header":"netdb.h", "extensions":[]}, + "endorder": {"id_type":"field", "header":"search.h", "extensions":[]}, "endprotoent": {"id_type":"function", "header":"netdb.h", "extensions":[]}, "endpwent": {"id_type":"function", "header":"pwd.h", "extensions":["XSI"]}, "endservent": {"id_type":"function", "header":"netdb.h", "extensions":[]}, @@ -546,6 +1012,7 @@ "ENOTSOCK": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "ENOTSUP": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "ENOTTY": {"id_type":"macro", "header":"errno.h", "extensions":[]}, + "ENTER": {"id_type":"field", "header":"search.h", "extensions":[]}, "ENTRY": {"id_type":"type", "header":"search.h", "extensions":[]}, "entry": {"id_type":"type", "header":"search.h", "extensions":[]}, "ENXIO": {"id_type":"macro", "header":"errno.h", "extensions":[]}, @@ -558,6 +1025,10 @@ "EPROTO": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "EPROTONOSUPPORT": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "EPROTOTYPE": {"id_type":"macro", "header":"errno.h", "extensions":[]}, + "ERA": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ERA_D_FMT": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ERA_D_T_FMT": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "ERA_T_FMT": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, "erand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, "ERANGE": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "erf": {"id_type":"function", "header":"math.h", "extensions":[]}, @@ -574,6 +1045,7 @@ "ETIME": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "ETIMEDOUT": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "ETXTBSY": {"id_type":"macro", "header":"errno.h", "extensions":[]}, + "events": {"id_type":"field", "header":"poll.h", "extensions":[]}, "EWOULDBLOCK": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "EXDEV": {"id_type":"macro", "header":"errno.h", "extensions":[]}, "execl": {"id_type":"function", "header":"unistd.h", "extensions":[], "notes":{"variadic-plugin":true}}, @@ -594,14 +1066,29 @@ "expm1": {"id_type":"function", "header":"math.h", "extensions":[]}, "expm1f": {"id_type":"function", "header":"math.h", "extensions":[]}, "expm1l": {"id_type":"function", "header":"math.h", "extensions":[]}, + "EXPR_NEST_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "EXTA": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, + "EXTB": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, + "f_bavail": {"id_type":"field", "header":"sys/statvfs.h", "extensions":[]}, + "f_bfree": {"id_type":"field", "header":"sys/statvfs.h", "extensions":[]}, + "f_blocks": {"id_type":"field", "header":"sys/statvfs.h", "extensions":[]}, + "f_bsize": {"id_type":"field", "header":"sys/statvfs.h", "extensions":[]}, "F_DUPFD": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, "F_DUPFD_CLOEXEC": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, + "f_favail": {"id_type":"field", "header":"sys/statvfs.h", "extensions":[]}, + "f_ffree": {"id_type":"field", "header":"sys/statvfs.h", "extensions":[]}, + "f_files": {"id_type":"field", "header":"sys/statvfs.h", "extensions":[]}, + "f_flag": {"id_type":"field", "header":"sys/statvfs.h", "extensions":[]}, + "f_frsize": {"id_type":"field", "header":"sys/statvfs.h", "extensions":[]}, + "f_fsid": {"id_type":"field", "header":"sys/statvfs.h", "extensions":[]}, "F_GETFD": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, "F_GETFL": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, "F_GETLK": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, "F_GETOWN": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, "F_LOCK": {"id_type":"constant", "header":"unistd.h", "extensions":["XSI"]}, + "f_namemax": {"id_type":"field", "header":"sys/statvfs.h", "extensions":[]}, "F_OK": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "F_RDLCK": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, "F_SETFD": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, "F_SETFL": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, "F_SETLK": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, @@ -610,6 +1097,8 @@ "F_TEST": {"id_type":"constant", "header":"unistd.h", "extensions":["XSI"]}, "F_TLOCK": {"id_type":"constant", "header":"unistd.h", "extensions":["XSI"]}, "F_ULOCK": {"id_type":"constant", "header":"unistd.h", "extensions":["XSI"]}, + "F_UNLCK": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, + "F_WRLCK": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, "fabs": {"id_type":"function", "header":"math.h", "extensions":[]}, "fabsf": {"id_type":"function", "header":"math.h", "extensions":[]}, "fabsl": {"id_type":"function", "header":"math.h", "extensions":[]}, @@ -623,6 +1112,8 @@ "fchownat": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "fclose": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "fcntl": {"id_type":"function", "header":"fcntl.h", "extensions":[], "notes":{"variadic-plugin":true}}, + "fcvt": {"id_type":"function", "header":"stdlib.h", "extensions":["REM"]}, + "fd": {"id_type":"field", "header":"stropts.h", "extensions":[]}, "FD_CLOEXEC": {"id_type":"constant", "header":"fcntl.h", "extensions":[]}, "FD_CLR": {"id_type":"function", "header":"sys/select.h", "extensions":[]}, "FD_ISSET": {"id_type":"function", "header":"sys/select.h", "extensions":[]}, @@ -637,11 +1128,24 @@ "fdiml": {"id_type":"function", "header":"math.h", "extensions":[]}, "fdopen": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "fdopendir": {"id_type":"function", "header":"dirent.h", "extensions":[]}, + "fds_bits": {"id_type":"field", "header":"sys/select.h", "extensions":["REM"]}, + "FE_ALL_EXCEPT": {"id_type":"macro", "header":"fenv.h", "extensions":[]}, + "FE_DFL_ENV": {"id_type":"macro", "header":"fenv.h", "extensions":[]}, + "FE_DIVBYZERO": {"id_type":"macro", "header":"fenv.h", "extensions":[]}, + "FE_DOWNWARD": {"id_type":"macro", "header":"fenv.h", "extensions":[]}, + "FE_INEXACT": {"id_type":"macro", "header":"fenv.h", "extensions":[]}, + "FE_INVALID": {"id_type":"macro", "header":"fenv.h", "extensions":[]}, + "FE_OVERFLOW": {"id_type":"macro", "header":"fenv.h", "extensions":[]}, + "FE_TONEAREST": {"id_type":"macro", "header":"fenv.h", "extensions":[]}, + "FE_TOWARDZERO": {"id_type":"macro", "header":"fenv.h", "extensions":[]}, + "FE_UNDERFLOW": {"id_type":"macro", "header":"fenv.h", "extensions":[]}, + "FE_UPWARD": {"id_type":"macro", "header":"fenv.h", "extensions":[]}, "feclearexcept": {"id_type":"function", "header":"fenv.h", "extensions":[]}, "fegetenv": {"id_type":"function", "header":"fenv.h", "extensions":[]}, "fegetexceptflag": {"id_type":"function", "header":"fenv.h", "extensions":[]}, "fegetround": {"id_type":"function", "header":"fenv.h", "extensions":[]}, "feholdexcept": {"id_type":"function", "header":"fenv.h", "extensions":[]}, + "FENV_ACCESS": {"id_type":"pragma", "header":"fenv.h", "extensions":[]}, "fenv_t": {"id_type":"type", "header":"fenv.h", "extensions":[]}, "feof": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "feraiseexcept": {"id_type":"function", "header":"fenv.h", "extensions":[]}, @@ -653,6 +1157,8 @@ "feupdateenv": {"id_type":"function", "header":"fenv.h", "extensions":[]}, "fexcept_t": {"id_type":"type", "header":"fenv.h", "extensions":[]}, "fexecve": {"id_type":"function", "header":"unistd.h", "extensions":[]}, + "FF0": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, + "FF1": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, "FFDLY": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "fflush": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "ffs": {"id_type":"function", "header":"strings.h", "extensions":["XSI"]}, @@ -661,14 +1167,36 @@ "fgets": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "fgetwc": {"id_type":"function", "header":"wchar.h", "extensions":[]}, "fgetws": {"id_type":"function", "header":"wchar.h", "extensions":[]}, + "FIFOTYPE": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "fildes": {"id_type":"field", "header":"stropts.h", "extensions":[]}, "FILE": {"id_type":"type", "header":"stdio.h", "extensions":["CX"]}, "FILENAME_MAX": {"id_type":"macro", "header":"stdio.h", "extensions":[]}, "fileno": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]}, + "FILESIZEBITS": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "FIND": {"id_type":"field", "header":"search.h", "extensions":[]}, + "flags": {"id_type":"field", "header":"stropts.h", "extensions":[]}, + "float_t": {"id_type":"type", "header":"math.h", "extensions":[]}, "flock": {"id_type":"type", "header":"fcntl.h", "extensions":[]}, "flockfile": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]}, "floor": {"id_type":"function", "header":"math.h", "extensions":[]}, "floorf": {"id_type":"function", "header":"math.h", "extensions":[]}, "floorl": {"id_type":"function", "header":"math.h", "extensions":[]}, + "FLT_DIG": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "FLT_EPSILON": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "FLT_EVAL_METHOD": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "FLT_MANT_DIG": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "FLT_MAX": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "FLT_MAX_10_EXP": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "FLT_MAX_EXP": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "FLT_MIN": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "FLT_MIN_10_EXP": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "FLT_MIN_EXP": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "FLT_RADIX": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "FLT_ROUNDS": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "FLUSHO": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, + "FLUSHR": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "FLUSHRW": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "FLUSHW": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, "fma": {"id_type":"function", "header":"math.h", "extensions":[]}, "fmaf": {"id_type":"function", "header":"math.h", "extensions":[]}, "fmal": {"id_type":"function", "header":"math.h", "extensions":[]}, @@ -679,26 +1207,48 @@ "fmin": {"id_type":"function", "header":"math.h", "extensions":[]}, "fminf": {"id_type":"function", "header":"math.h", "extensions":[]}, "fminl": {"id_type":"function", "header":"math.h", "extensions":[]}, + "FMNAMESZ": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, "fmod": {"id_type":"function", "header":"math.h", "extensions":[]}, "fmodf": {"id_type":"function", "header":"math.h", "extensions":[]}, "fmodl": {"id_type":"function", "header":"math.h", "extensions":[]}, "fmtmsg": {"id_type":"function", "header":"fmtmsg.h", "extensions":[]}, "FNM_NOESCAPE": {"id_type":"constant", "header":"fnmatch.h", "extensions":[]}, "FNM_NOMATCH": {"id_type":"constant", "header":"fnmatch.h", "extensions":[]}, + "FNM_NOSYS": {"id_type":"constant", "header":"fnmatch.h", "extensions":["REM"]}, "FNM_PATHNAME": {"id_type":"constant", "header":"fnmatch.h", "extensions":[]}, "FNM_PERIOD": {"id_type":"constant", "header":"fnmatch.h", "extensions":[]}, "fnmatch": {"id_type":"function", "header":"fnmatch.h", "extensions":[]}, "fopen": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "FOPEN_MAX": {"id_type":"macro", "header":"stdio.h", "extensions":[]}, "fork": {"id_type":"function", "header":"unistd.h", "extensions":[]}, + "FP_CONTRACT": {"id_type":"pragma", "header":"math.h", "extensions":[]}, + "FP_FAST_FMA": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "FP_FAST_FMAF": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "FP_FAST_FMAL": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "FP_ILOGB0": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "FP_ILOGBNAN": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "FP_INFINITE": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "FP_NAN": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "FP_NORMAL": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "FP_SUBNORMAL": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "FP_ZERO": {"id_type":"macro", "header":"math.h", "extensions":[]}, "fpathconf": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "fpclassify": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "FPE_FLTDIV": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "FPE_FLTINV": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "FPE_FLTOVF": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "FPE_FLTRES": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "FPE_FLTSUB": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "FPE_FLTUND": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "FPE_INTDIV": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "FPE_INTOVF": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, "fpos_t": {"id_type":"type", "header":"stdio.h", "extensions":[]}, "fprintf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}}, "fputc": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "fputs": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "fputwc": {"id_type":"function", "header":"wchar.h", "extensions":[]}, "fputws": {"id_type":"function", "header":"wchar.h", "extensions":[]}, + "frac_digits": {"id_type":"field", "header":"locale.h", "extensions":[]}, "fread": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "free": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "freeaddrinfo": {"id_type":"function", "header":"netdb.h", "extensions":[]}, @@ -742,14 +1292,16 @@ "fwrite": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "fwscanf": {"id_type":"function", "header":"wchar.h", "extensions":[], "notes":{"variadic-plugin":true}}, "gai_strerror": {"id_type":"function", "header":"netdb.h", "extensions":[]}, - "getaddrinfo": {"id_type":"function", "header":"netdb.h", "extensions":["IP6"]}, + "gcvt": {"id_type":"function", "header":"stdlib.h", "extensions":["REM"]}, + "getaddrinfo": {"id_type":"function", "header":"netdb.h", "extensions":[]}, "GETALL": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]}, "getc": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "getc_unlocked": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]}, "getchar": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "getchar_unlocked": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]}, "getcwd": {"id_type":"function", "header":"unistd.h", "extensions":[]}, - "getdate": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "getdate": {"id_type":"function", "header":"time.h", "extensions":[]}, + "getdate_err": {"id_type":"macroOrIdentifier", "header":"time.h", "extensions":["XSI"]}, "getdelim": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]}, "getegid": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "getenv": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, @@ -766,7 +1318,7 @@ "gethostent": {"id_type":"function", "header":"netdb.h", "extensions":[]}, "gethostid": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]}, "gethostname": {"id_type":"function", "header":"unistd.h", "extensions":[]}, - "getitimer": {"id_type":"function", "header":"sys/time.h", "extensions":["IP6"]}, + "getitimer": {"id_type":"function", "header":"sys/time.h", "extensions":[]}, "getline": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]}, "getlogin": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "getlogin_r": {"id_type":"function", "header":"unistd.h", "extensions":[]}, @@ -777,7 +1329,7 @@ "getnetbyname": {"id_type":"function", "header":"netdb.h", "extensions":[]}, "getnetent": {"id_type":"function", "header":"netdb.h", "extensions":[]}, "getopt": {"id_type":"function", "header":"unistd.h", "extensions":[]}, - "getpeername": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, + "getpeername": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, "getpgid": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "getpgrp": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "GETPID": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]}, @@ -800,19 +1352,25 @@ "getservbyport": {"id_type":"function", "header":"netdb.h", "extensions":[]}, "getservent": {"id_type":"function", "header":"netdb.h", "extensions":[]}, "getsid": {"id_type":"function", "header":"unistd.h", "extensions":[]}, - "getsockname": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, - "getsockopt": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, + "getsockname": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, + "getsockopt": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, "getsubopt": {"id_type":"function", "header":"stdlib.h", "extensions":["CX"]}, - "gettimeofday": {"id_type":"function", "header":"sys/time.h", "extensions":["IP6"]}, + "gettimeofday": {"id_type":"function", "header":"sys/time.h", "extensions":[]}, "getuid": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "getutxent": {"id_type":"function", "header":"utmpx.h", "extensions":[]}, "getutxid": {"id_type":"function", "header":"utmpx.h", "extensions":[]}, "getutxline": {"id_type":"function", "header":"utmpx.h", "extensions":[]}, "GETVAL": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]}, + "getw": {"id_type":"function", "header":"stdint.h", "extensions":["REM"]}, "getwc": {"id_type":"function", "header":"wchar.h", "extensions":[]}, "getwchar": {"id_type":"function", "header":"wchar.h", "extensions":[]}, + "getwd": {"id_type":"function", "header":"unistd.h", "extensions":["REM"]}, "GETZCNT": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]}, + "gid": {"id_type":"field", "header":"stropts.h", "extensions":[]}, "gid_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, + "gl_offs": {"id_type":"field", "header":"glob.h", "extensions":[]}, + "gl_pathc": {"id_type":"field", "header":"glob.h", "extensions":[]}, + "gl_pathv": {"id_type":"field", "header":"glob.h", "extensions":[]}, "glob": {"id_type":"function", "header":"glob.h", "extensions":[]}, "GLOB_ABORTED": {"id_type":"constant", "header":"glob.h", "extensions":[]}, "GLOB_APPEND": {"id_type":"constant", "header":"glob.h", "extensions":[]}, @@ -824,15 +1382,28 @@ "GLOB_NOMATCH": {"id_type":"constant", "header":"glob.h", "extensions":[]}, "GLOB_NOSORT": {"id_type":"constant", "header":"glob.h", "extensions":[]}, "GLOB_NOSPACE": {"id_type":"constant", "header":"glob.h", "extensions":[]}, + "GLOB_NOSYS": {"id_type":"constant", "header":"glob.h", "extensions":["REM"]}, "glob_t": {"id_type":"type", "header":"glob.h", "extensions":[]}, "globfree": {"id_type":"function", "header":"glob.h", "extensions":[]}, - "gmtime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "gmtime_r": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "gmtime": {"id_type":"function", "header":"time.h", "extensions":[]}, + "gmtime_r": {"id_type":"function", "header":"time.h", "extensions":[]}, + "gr_gid": {"id_type":"field", "header":"grp.h", "extensions":[]}, + "gr_mem": {"id_type":"field", "header":"grp.h", "extensions":[]}, + "gr_name": {"id_type":"field", "header":"grp.h", "extensions":[]}, "grantpt": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, - "group": {"id_type":"type", "header":"grp.h", "extensions":["XSI"]}, + "group": {"id_type":"type", "header":"grp.h", "extensions":[]}, + "grouping": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "h_addr_list": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "h_addrtype": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "h_aliases": {"id_type":"field", "header":"netdb.h", "extensions":[]}, "h_errno": {"id_type":"macroOrIdentifier", "header":"netdb.h", "extensions":["OB","REM"]}, + "h_errno": {"id_type":"variable", "header":"netdb.h", "extensions":["REM"]}, + "h_length": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "h_name": {"id_type":"field", "header":"netdb.h", "extensions":[]}, "hcreate": {"id_type":"function", "header":"search.h", "extensions":[]}, "hdestroy": {"id_type":"function", "header":"search.h", "extensions":[]}, + "HOST_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "HOST_NOT_FOUND": {"id_type":"macro", "header":"netdb.h", "extensions":["REM"]}, "hostent": {"id_type":"type", "header":"netdb.h", "extensions":[]}, "hsearch": {"id_type":"function", "header":"search.h", "extensions":[]}, "htonl": {"id_type":"function", "header":"arpa/inet.h", "extensions":[]}, @@ -845,6 +1416,39 @@ "hypotf": {"id_type":"function", "header":"math.h", "extensions":[]}, "hypotl": {"id_type":"function", "header":"math.h", "extensions":[]}, "I": {"id_type":"macro", "header":"complex.h", "extensions":[]}, + "I_ATMARK": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_CANPUT": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_CKBAND": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_FDINSERT": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_FIND": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_FLUSH": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_FLUSHBAND": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_GETBAND": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_GETCLTIME": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_GETSIG": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_GRDOPT": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_GWROPT": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_LINK": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_LIST": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_LOOK": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_NREAD": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_PEEK": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_PLINK": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_POP": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_PUNLINK": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_PUSH": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_RECVFD": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_SENDFD": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_SETCLTIME": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_SETSIG": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_SRDOPT": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_STR": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_SWROPT": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "I_UNLINK": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "ic_cmd": {"id_type":"field", "header":"stropts.h", "extensions":[]}, + "ic_dp": {"id_type":"field", "header":"stropts.h", "extensions":[]}, + "ic_len": {"id_type":"field", "header":"stropts.h", "extensions":[]}, + "ic_timout": {"id_type":"field", "header":"stropts.h", "extensions":[]}, "ICANON": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "iconv": {"id_type":"function", "header":"iconv.h", "extensions":[]}, "iconv_close": {"id_type":"function", "header":"iconv.h", "extensions":[]}, @@ -852,21 +1456,33 @@ "iconv_t": {"id_type":"type", "header":"iconv.h", "extensions":[]}, "ICRNL": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "id_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, + "idtype_t": {"id_type":"type", "header":"sys/wait.h", "extensions":[]}, "IEXTEN": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "if_freenameindex": {"id_type":"function", "header":"net/if.h", "extensions":[]}, + "if_index": {"id_type":"field", "header":"net/if.h", "extensions":[]}, "if_indextoname": {"id_type":"function", "header":"net/if.h", "extensions":[]}, + "if_name": {"id_type":"field", "header":"net/if.h", "extensions":[]}, "if_nameindex": {"id_type":"function", "header":"net/if.h", "extensions":[]}, "IF_NAMESIZE": {"id_type":"constant", "header":"net/if.h", "extensions":[]}, "if_nametoindex": {"id_type":"function", "header":"net/if.h", "extensions":[]}, "IGNBRK": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "IGNCR": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "IGNPAR": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "ILL_BADSTK": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "ILL_COPROC": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "ILL_ILLADR": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "ILL_ILLOPC": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "ILL_ILLOPN": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "ILL_ILLTRP": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "ILL_PRVOPC": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "ILL_PRVREG": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, "ilogb": {"id_type":"function", "header":"math.h", "extensions":[]}, "ilogbf": {"id_type":"function", "header":"math.h", "extensions":[]}, "ilogbl": {"id_type":"function", "header":"math.h", "extensions":[]}, "imaginary": {"id_type":"macro", "header":"complex.h", "extensions":[]}, "imaxabs": {"id_type":"function", "header":"inttypes.h", "extensions":[]}, "imaxdiv": {"id_type":"function", "header":"inttypes.h", "extensions":[]}, + "imaxdiv_t": {"id_type":"type", "header":"inttypes.h", "extensions":[]}, "in6_addr": {"id_type":"type", "header":"netinet/in.h", "extensions":["IP6"]}, "IN6_IS_ADDR_LINKLOCAL": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]}, "IN6_IS_ADDR_LOOPBACK": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]}, @@ -881,12 +1497,15 @@ "IN6_IS_ADDR_V4COMPAT": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]}, "IN6_IS_ADDR_V4MAPPED": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]}, "in6addr_any": {"id_type":"variable", "header":"netinet/in.h", "extensions":["IP6"]}, + "IN6ADDR_ANY_INIT": {"id_type":"macro", "header":"netinet/in.h", "extensions":["IP6"]}, "in6addr_loopback": {"id_type":"variable", "header":"netinet/in.h", "extensions":["IP6"]}, + "IN6ADDR_LOOPBACK_INIT": {"id_type":"macro", "header":"netinet/in.h", "extensions":["IP6"]}, "in_addr": {"id_type":"type", "header":"netinet/in.h", "extensions":[]}, "in_addr_t": {"id_type":"type", "header":"netinet/in.h", "extensions":[]}, - "in_port_t": {"id_type":"type", "header":"netinet/in.h", "extensions":["IP6"]}, + "in_port_t": {"id_type":"type", "header":"netinet/in.h", "extensions":[]}, "INADDR_ANY": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]}, "INADDR_BROADCAST": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]}, + "index": {"id_type":"function", "header":"strings.h", "extensions":["REM"]}, "INET6_ADDRSTRLEN": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]}, "inet_addr": {"id_type":"function", "header":"arpa/inet.h", "extensions":[]}, "INET_ADDRSTRLEN": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]}, @@ -900,14 +1519,77 @@ "ino_t": {"id_type":"type", "header":"sys/types.h", "extensions":["XSI"]}, "INPCK": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "insque": {"id_type":"function", "header":"search.h", "extensions":[]}, + "INT16_C": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT16_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT16_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "int16_t": {"id_type":"type", "header":"stdint.h", "extensions":["CX"]}, + "INT32_C": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT32_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT32_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "int32_t": {"id_type":"type", "header":"stdint.h", "extensions":["CX"]}, + "INT64_C": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT64_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT64_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "int64_t": {"id_type":"type", "header":"stdint.h", "extensions":["CX"]}, + "INT8_C": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT8_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT8_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "int8_t": {"id_type":"type", "header":"stdint.h", "extensions":["CX"]}, + "int_curr_symbol": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "INT_FAST16_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT_FAST16_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "int_fast16_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "INT_FAST32_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT_FAST32_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "int_fast32_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "INT_FAST64_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT_FAST64_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "int_fast64_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "INT_FAST8_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT_FAST8_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "int_fast8_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "int_frac_digits": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "INT_LEAST16_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT_LEAST16_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "int_least16_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "INT_LEAST32_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT_LEAST32_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "int_least32_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "INT_LEAST64_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT_LEAST64_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "int_least64_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "INT_LEAST8_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INT_LEAST8_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "int_least8_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, "INT_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]}, "INT_MIN": {"id_type":"macro", "header":"limits.h", "extensions":[]}, + "int_n_cs_precedes": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "int_n_sep_by_space": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "int_n_sign_posn": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "int_p_cs_precedes": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "int_p_sep_by_space": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "int_p_sign_posn": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "INTMAX_C": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INTMAX_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INTMAX_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "intmax_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "INTPTR_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "INTPTR_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "intptr_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, "ioctl": {"id_type":"function", "header":"stropts.h", "extensions":["OB","XSR"], "notes":{"variadic-plugin":true}}, + "iov_base": {"id_type":"field", "header":"sys/uio.h", "extensions":[]}, + "iov_len": {"id_type":"field", "header":"sys/uio.h", "extensions":[]}, + "IOV_MAX": {"id_type":"constant", "header":"limits.h", "extensions":["XSI"]}, "iovec": {"id_type":"type", "header":"sys/uio.h", "extensions":["XSI"]}, "IPC_CREAT": {"id_type":"constant", "header":"sys/ipc.h", "extensions":[]}, "IPC_EXCL": {"id_type":"constant", "header":"sys/ipc.h", "extensions":[]}, "IPC_NOWAIT": {"id_type":"constant", "header":"sys/ipc.h", "extensions":[]}, "ipc_perm": {"id_type":"type", "header":"sys/ipc.h", "extensions":[]}, + "IPC_PRIVATE": {"id_type":"constant", "header":"sys/ipc.h", "extensions":[]}, + "IPC_RMID": {"id_type":"constant", "header":"sys/ipc.h", "extensions":[]}, + "IPC_SET": {"id_type":"constant", "header":"sys/ipc.h", "extensions":[]}, + "IPC_STAT": {"id_type":"constant", "header":"sys/ipc.h", "extensions":[]}, + "IPPORT_RESERVED": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, "IPPROTO_ICMP": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]}, "IPPROTO_IP": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]}, "IPPROTO_IPV6": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]}, @@ -922,6 +1604,8 @@ "IPV6_MULTICAST_LOOP": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]}, "IPV6_UNICAST_HOPS": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]}, "IPV6_V6ONLY": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]}, + "ipv6mr_interface": {"id_type":"field", "header":"netinet/in.h", "extensions":["IP6"]}, + "ipv6mr_multiaddr": {"id_type":"field", "header":"netinet/in.h", "extensions":["IP6"]}, "isalnum": {"id_type":"function", "header":"ctype.h", "extensions":[]}, "isalnum_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]}, "isalpha": {"id_type":"function", "header":"ctype.h", "extensions":[]}, @@ -987,16 +1671,20 @@ "iswxdigit_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]}, "isxdigit": {"id_type":"function", "header":"ctype.h", "extensions":[]}, "isxdigit_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]}, - "ITIMER_PROF": {"id_type":"constant", "header":"sys/time.h", "extensions":["IP6"]}, - "ITIMER_REAL": {"id_type":"constant", "header":"sys/time.h", "extensions":["IP6"]}, - "ITIMER_VIRTUAL": {"id_type":"constant", "header":"sys/time.h", "extensions":["IP6"]}, - "itimerspec": {"id_type":"type", "header":"time.h", "extensions":["IP6"]}, - "itimerval": {"id_type":"type", "header":"sys/time.h", "extensions":["IP6"]}, + "it_interval": {"id_type":"field", "header":"time.h", "extensions":[]}, + "it_value": {"id_type":"field", "header":"time.h", "extensions":[]}, + "ITIMER_PROF": {"id_type":"constant", "header":"sys/time.h", "extensions":[]}, + "ITIMER_REAL": {"id_type":"constant", "header":"sys/time.h", "extensions":[]}, + "ITIMER_VIRTUAL": {"id_type":"constant", "header":"sys/time.h", "extensions":[]}, + "itimerspec": {"id_type":"type", "header":"time.h", "extensions":[]}, + "itimerval": {"id_type":"type", "header":"sys/time.h", "extensions":[]}, + "IUCLC": {"id_type":"constant", "header":"termios.h", "extensions":["REM"]}, "IXANY": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "IXOFF": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "IXON": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "j0": {"id_type":"function", "header":"math.h", "extensions":["XSI"]}, "j1": {"id_type":"function", "header":"math.h", "extensions":["XSI"]}, + "jmp_buf": {"id_type":"type", "header":"setjmp.h", "extensions":[]}, "jn": {"id_type":"function", "header":"math.h", "extensions":["XSI"]}, "jrand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, "key_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, @@ -1004,22 +1692,60 @@ "killpg": {"id_type":"function", "header":"signal.h", "extensions":[]}, "l64a": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "L_ctermid": {"id_type":"type", "header":"stdio.h", "extensions":[]}, + "L_cuserid": {"id_type":"constant", "header":"stdint.h", "extensions":["REM"]}, + "l_len": {"id_type":"field", "header":"fcntl.h", "extensions":[]}, + "l_linger": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "l_name": {"id_type":"field", "header":"stropts.h", "extensions":[]}, + "l_onoff": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "l_pid": {"id_type":"field", "header":"fcntl.h", "extensions":[]}, + "l_start": {"id_type":"field", "header":"fcntl.h", "extensions":[]}, "L_tmpnam": {"id_type":"type", "header":"stdio.h", "extensions":[]}, + "l_type": {"id_type":"field", "header":"fcntl.h", "extensions":[]}, + "l_whence": {"id_type":"field", "header":"fcntl.h", "extensions":[]}, "labs": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, + "LASTMARK": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "LC_ALL": {"id_type":"macro", "header":"locale.h", "extensions":[]}, + "LC_ALL_MASK": {"id_type":"macro", "header":"locale.h", "extensions":["CX"]}, + "LC_COLLATE": {"id_type":"macro", "header":"locale.h", "extensions":[]}, + "LC_COLLATE_MASK": {"id_type":"macro", "header":"locale.h", "extensions":["CX"]}, + "LC_CTYPE": {"id_type":"macro", "header":"locale.h", "extensions":[]}, + "LC_CTYPE_MASK": {"id_type":"macro", "header":"locale.h", "extensions":["CX"]}, + "LC_GLOBAL_LOCALE": {"id_type":"macro", "header":"locale.h", "extensions":["CX"]}, + "LC_MESSAGES": {"id_type":"macro", "header":"locale.h", "extensions":["CX"]}, + "LC_MESSAGES_MASK": {"id_type":"macro", "header":"locale.h", "extensions":["CX"]}, + "LC_MONETARY": {"id_type":"macro", "header":"locale.h", "extensions":[]}, + "LC_MONETARY_MASK": {"id_type":"macro", "header":"locale.h", "extensions":["CX"]}, + "LC_NUMERIC": {"id_type":"macro", "header":"locale.h", "extensions":[]}, + "LC_NUMERIC_MASK": {"id_type":"macro", "header":"locale.h", "extensions":["CX"]}, + "LC_TIME": {"id_type":"macro", "header":"locale.h", "extensions":[]}, + "LC_TIME_MASK": {"id_type":"macro", "header":"locale.h", "extensions":["CX"]}, "lchown": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "lcong48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, "lconv": {"id_type":"type", "header":"locale.h", "extensions":[]}, + "LDBL_DIG": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "LDBL_EPSILON": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "LDBL_MANT_DIG": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "LDBL_MAX": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "LDBL_MAX_10_EXP": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "LDBL_MAX_EXP": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "LDBL_MIN": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "LDBL_MIN_10_EXP": {"id_type":"constant", "header":"float.h", "extensions":[]}, + "LDBL_MIN_EXP": {"id_type":"constant", "header":"float.h", "extensions":[]}, "ldexp": {"id_type":"function", "header":"math.h", "extensions":[]}, "ldexpf": {"id_type":"function", "header":"math.h", "extensions":[]}, "ldexpl": {"id_type":"function", "header":"math.h", "extensions":[]}, "ldiv": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "ldiv_t": {"id_type":"type", "header":"stdlib.h", "extensions":[]}, + "leaf": {"id_type":"field", "header":"search.h", "extensions":[]}, + "len": {"id_type":"field", "header":"stropts.h", "extensions":[]}, "lfind": {"id_type":"function", "header":"search.h", "extensions":[]}, "lgamma": {"id_type":"function", "header":"math.h", "extensions":[]}, "lgammaf": {"id_type":"function", "header":"math.h", "extensions":[]}, "lgammal": {"id_type":"function", "header":"math.h", "extensions":[]}, - "linger": {"id_type":"type", "header":"sys/socket.h", "extensions":["IP6"]}, - "link": {"id_type":"function", "header":"unistd.h", "extensions":["IP6"]}, + "LINE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "linger": {"id_type":"type", "header":"sys/socket.h", "extensions":[]}, + "link": {"id_type":"function", "header":"unistd.h", "extensions":[]}, + "LINK_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "linkat": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "lio_listio": {"id_type":"function", "header":"aio.h", "extensions":[]}, "LIO_NOP": {"id_type":"constant", "header":"aio.h", "extensions":[]}, @@ -1027,7 +1753,7 @@ "LIO_READ": {"id_type":"constant", "header":"aio.h", "extensions":[]}, "LIO_WAIT": {"id_type":"constant", "header":"aio.h", "extensions":[]}, "LIO_WRITE": {"id_type":"constant", "header":"aio.h", "extensions":[]}, - "listen": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, + "listen": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, "llabs": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "lldiv": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "lldiv_t": {"id_type":"type", "header":"stdlib.h", "extensions":[]}, @@ -1039,10 +1765,12 @@ "llround": {"id_type":"function", "header":"math.h", "extensions":[]}, "llroundf": {"id_type":"function", "header":"math.h", "extensions":[]}, "llroundl": {"id_type":"function", "header":"math.h", "extensions":[]}, + "LNKTYPE": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "LOBLK": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, "locale_t": {"id_type":"type", "header":"wchar.h", "extensions":["CX"]}, "localeconv": {"id_type":"function", "header":"locale.h", "extensions":[]}, - "localtime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "localtime_r": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "localtime": {"id_type":"function", "header":"time.h", "extensions":[]}, + "localtime_r": {"id_type":"function", "header":"time.h", "extensions":[]}, "lockf": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]}, "log": {"id_type":"function", "header":"math.h", "extensions":[]}, "log10": {"id_type":"function", "header":"math.h", "extensions":[]}, @@ -1089,6 +1817,7 @@ "logbf": {"id_type":"function", "header":"math.h", "extensions":[]}, "logbl": {"id_type":"function", "header":"math.h", "extensions":[]}, "logf": {"id_type":"function", "header":"math.h", "extensions":[]}, + "LOGIN_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "LOGIN_PROCESS": {"id_type":"constant", "header":"utmpx.h", "extensions":[]}, "logl": {"id_type":"function", "header":"math.h", "extensions":[]}, "LONG_BIT": {"id_type":"macro", "header":"limits.h", "extensions":[]}, @@ -1118,12 +1847,20 @@ "M_PI_4": {"id_type":"constant", "header":"math.h", "extensions":[]}, "M_SQRT1_2": {"id_type":"constant", "header":"math.h", "extensions":[]}, "M_SQRT2": {"id_type":"constant", "header":"math.h", "extensions":[]}, + "machine": {"id_type":"field", "header":"sys/utsname.h", "extensions":[]}, + "MAGIC": {"id_type":"constant", "header":"cpio.h", "extensions":[]}, "malloc": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "MAP_FAILED": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]}, "MAP_FIXED": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]}, "MAP_PRIVATE": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]}, "MAP_SHARED": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]}, + "MATH_ERREXCEPT": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "math_errhandling": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "MATH_ERRNO": {"id_type":"macro", "header":"math.h", "extensions":[]}, + "MAX_CANON": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "MAX_INPUT": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "MAXFLOAT": {"id_type":"constant", "header":"math.h", "extensions":[]}, + "maxlen": {"id_type":"field", "header":"stropts.h", "extensions":[]}, "MB_CUR_MAX": {"id_type":"macro", "header":"stdlib.h", "extensions":[]}, "MB_LEN_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]}, "mblen": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, @@ -1137,6 +1874,7 @@ "mbtowc": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "MCL_CURRENT": {"id_type":"constant", "header":"sys/mman.h", "extensions":["ML"]}, "MCL_FUTURE": {"id_type":"constant", "header":"sys/mman.h", "extensions":["ML"]}, + "mcontext_t": {"id_type":"type", "header":"signal.h", "extensions":["CX"]}, "memccpy": {"id_type":"function", "header":"string.h", "extensions":[]}, "memchr": {"id_type":"function", "header":"string.h", "extensions":[]}, "memcmp": {"id_type":"function", "header":"string.h", "extensions":[]}, @@ -1152,7 +1890,8 @@ "mknod": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]}, "mknodat": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]}, "mkstemp": {"id_type":"function", "header":"stdlib.h", "extensions":["CX"]}, - "mktime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "mktemp": {"id_type":"function", "header":"stdlib.h", "extensions":["REM"]}, + "mktime": {"id_type":"function", "header":"time.h", "extensions":[]}, "mlock": {"id_type":"function", "header":"sys/mman.h", "extensions":["MLR"]}, "mlockall": {"id_type":"function", "header":"sys/mman.h", "extensions":["ML"]}, "MM_APPL": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, @@ -1162,8 +1901,18 @@ "MM_HALT": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, "MM_HARD": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, "MM_INFO": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, + "MM_NOCON": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, + "MM_NOMSG": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, "MM_NOSEV": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, + "MM_NOTOK": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, "MM_NRECOV": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, + "MM_NULLACT": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, + "MM_NULLLBL": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, + "MM_NULLMC": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, + "MM_NULLSEV": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, + "MM_NULLTAG": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, + "MM_NULLTXT": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, + "MM_OK": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, "MM_OPSYS": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, "MM_PRINT": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, "MM_RECOVER": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, @@ -1171,43 +1920,82 @@ "MM_UTIL": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, "MM_WARNING": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]}, "mmap": {"id_type":"function", "header":"sys/mman.h", "extensions":["TYM"]}, + "mode": {"id_type":"field", "header":"sys/ipc.h", "extensions":[]}, "mode_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, "modf": {"id_type":"function", "header":"math.h", "extensions":[]}, "modff": {"id_type":"function", "header":"math.h", "extensions":[]}, "modfl": {"id_type":"function", "header":"math.h", "extensions":[]}, + "modtime": {"id_type":"field", "header":"utime.h", "extensions":[]}, + "MON_1": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "MON_10": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "MON_11": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "MON_12": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "MON_2": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "MON_3": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "MON_4": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "MON_5": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "MON_6": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "MON_7": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "MON_8": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "MON_9": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "mon_decimal_point": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "mon_grouping": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "mon_thousands_sep": {"id_type":"field", "header":"locale.h", "extensions":[]}, "MORECTL": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, "MOREDATA": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, "mprotect": {"id_type":"function", "header":"sys/mman.h", "extensions":[]}, "mq_attr": {"id_type":"type", "header":"mqueue.h", "extensions":[]}, "mq_close": {"id_type":"function", "header":"mqueue.h", "extensions":[]}, + "mq_curmsgs": {"id_type":"field", "header":"mqueue.h", "extensions":[]}, + "mq_flags": {"id_type":"field", "header":"mqueue.h", "extensions":[]}, "mq_getattr": {"id_type":"function", "header":"mqueue.h", "extensions":[]}, + "mq_maxmsg": {"id_type":"field", "header":"mqueue.h", "extensions":[]}, + "mq_msgsize": {"id_type":"field", "header":"mqueue.h", "extensions":[]}, "mq_notify": {"id_type":"function", "header":"mqueue.h", "extensions":[]}, "mq_open": {"id_type":"function", "header":"mqueue.h", "extensions":[]}, + "MQ_OPEN_MAX": {"id_type":"constant", "header":"limits.h", "extensions":["MSG"]}, + "MQ_PRIO_MAX": {"id_type":"constant", "header":"limits.h", "extensions":["MSG"]}, "mq_receive": {"id_type":"function", "header":"mqueue.h", "extensions":[]}, "mq_send": {"id_type":"function", "header":"mqueue.h", "extensions":[]}, "mq_setattr": {"id_type":"function", "header":"mqueue.h", "extensions":[]}, "mq_timedreceive": {"id_type":"function", "header":"mqueue.h", "extensions":[]}, "mq_timedsend": {"id_type":"function", "header":"mqueue.h", "extensions":[]}, "mq_unlink": {"id_type":"function", "header":"mqueue.h", "extensions":[]}, + "mqd_t": {"id_type":"type", "header":"mqueue.h", "extensions":[]}, "mrand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, "MS_ASYNC": {"id_type":"constant", "header":"sys/mman.h", "extensions":["XSI","SIO"]}, "MS_INVALIDATE": {"id_type":"constant", "header":"sys/mman.h", "extensions":["XSI","SIO"]}, "MS_SYNC": {"id_type":"constant", "header":"sys/mman.h", "extensions":["XSI","SIO"]}, "MSG_ANY": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, "MSG_BAND": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, - "MSG_CTRUNC": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "MSG_DONTROUTE": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "MSG_EOR": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, + "msg_control": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "msg_controllen": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "msg_ctime": {"id_type":"field", "header":"sys/msg.h", "extensions":[]}, + "MSG_CTRUNC": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "MSG_DONTROUTE": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "MSG_EOR": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "msg_flags": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, "MSG_HIPRI": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "msg_iov": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "msg_iovlen": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "msg_lrpid": {"id_type":"field", "header":"sys/msg.h", "extensions":[]}, + "msg_lspid": {"id_type":"field", "header":"sys/msg.h", "extensions":[]}, + "msg_name": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "msg_namelen": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, "MSG_NOERROR": {"id_type":"constant", "header":"sys/msg.h", "extensions":[]}, - "MSG_NOSIGNAL": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "MSG_OOB": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "MSG_PEEK": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "MSG_TRUNC": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "MSG_WAITALL": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, + "MSG_NOSIGNAL": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "MSG_OOB": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "MSG_PEEK": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "msg_perm": {"id_type":"field", "header":"sys/msg.h", "extensions":[]}, + "msg_qbytes": {"id_type":"field", "header":"sys/msg.h", "extensions":[]}, + "msg_qnum": {"id_type":"field", "header":"sys/msg.h", "extensions":[]}, + "msg_rtime": {"id_type":"field", "header":"sys/msg.h", "extensions":[]}, + "msg_stime": {"id_type":"field", "header":"sys/msg.h", "extensions":[]}, + "MSG_TRUNC": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "MSG_WAITALL": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, "msgctl": {"id_type":"function", "header":"sys/msg.h", "extensions":[]}, "msgget": {"id_type":"function", "header":"sys/msg.h", "extensions":[]}, - "msghdr": {"id_type":"type", "header":"sys/socket.h", "extensions":["IP6"]}, + "msghdr": {"id_type":"type", "header":"sys/socket.h", "extensions":[]}, "msglen_t": {"id_type":"type", "header":"sys/msg.h", "extensions":[]}, "msgqnum_t": {"id_type":"type", "header":"sys/msg.h", "extensions":[]}, "msgrcv": {"id_type":"function", "header":"sys/msg.h", "extensions":[]}, @@ -1217,15 +2005,26 @@ "munlock": {"id_type":"function", "header":"sys/mman.h", "extensions":["MLR"]}, "munlockall": {"id_type":"function", "header":"sys/mman.h", "extensions":["ML"]}, "munmap": {"id_type":"function", "header":"sys/mman.h", "extensions":[]}, + "MUXID_ALL": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "n_addrtype": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "n_aliases": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "n_cs_precedes": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "n_name": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "n_net": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "n_sep_by_space": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "n_sign_posn": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "nan": {"id_type":"function", "header":"math.h", "extensions":[]}, "NAN": {"id_type":"macro", "header":"math.h", "extensions":[]}, "nanf": {"id_type":"function", "header":"math.h", "extensions":[]}, "nanl": {"id_type":"function", "header":"math.h", "extensions":[]}, - "nanosleep": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "nanosleep": {"id_type":"function", "header":"time.h", "extensions":[]}, "NCCS": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "NDEBUG": {"id_type":"macro", "header":"assert.h", "extensions":[]}, "nearbyint": {"id_type":"function", "header":"math.h", "extensions":[]}, "nearbyintf": {"id_type":"function", "header":"math.h", "extensions":[]}, "nearbyintl": {"id_type":"function", "header":"math.h", "extensions":[]}, + "negative_sign": {"id_type":"field", "header":"locale.h", "extensions":[]}, "netent": {"id_type":"type", "header":"netdb.h", "extensions":[]}, "NEW_TIME": {"id_type":"constant", "header":"utmpx.h", "extensions":[]}, "newlocale": {"id_type":"function", "header":"locale.h", "extensions":["CX"]}, @@ -1237,6 +2036,7 @@ "nexttowardl": {"id_type":"function", "header":"math.h", "extensions":[]}, "nfds_t": {"id_type":"type", "header":"poll.h", "extensions":[]}, "nftw": {"id_type":"function", "header":"ftw.h", "extensions":["OB"]}, + "NGROUPS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "NI_DGRAM": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, "NI_NAMEREQD": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, "NI_NOFQDN": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, @@ -1244,16 +2044,28 @@ "NI_NUMERICSCOPE": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, "NI_NUMERICSERV": {"id_type":"constant", "header":"netdb.h", "extensions":[]}, "nice": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]}, + "NL0": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, + "NL1": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, "NL_ARGMAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "NL_CAT_LOCALE": {"id_type":"constant", "header":"nl_types.h", "extensions":[]}, + "nl_catd": {"id_type":"type", "header":"nl_types.h", "extensions":[]}, + "nl_item": {"id_type":"type", "header":"nl_types.h", "extensions":[]}, "nl_langinfo": {"id_type":"function", "header":"langinfo.h", "extensions":[]}, "nl_langinfo_l": {"id_type":"function", "header":"langinfo.h", "extensions":[]}, "NL_LANGMAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "NL_MSGMAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "NL_NMAX": {"id_type":"constant", "header":"limits.h", "extensions":["REM"]}, + "NL_SETD": {"id_type":"constant", "header":"nl_types.h", "extensions":[]}, "NL_SETMAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "NL_TEXTMAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "NLDLY": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "nlink_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, + "NO_DATA": {"id_type":"macro", "header":"netdb.h", "extensions":["REM"]}, + "NO_RECOVERY": {"id_type":"macro", "header":"netdb.h", "extensions":["REM"]}, + "nodename": {"id_type":"field", "header":"sys/utsname.h", "extensions":[]}, + "NOEXPR": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, "NOFLSH": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "NOSTR": {"id_type":"constant", "header":"langinfo.h", "extensions":["REM"]}, "not": {"id_type":"macro", "header":"iso646.h", "extensions":["ADV"]}, "not_eq": {"id_type":"macro", "header":"iso646.h", "extensions":[]}, "nrand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, @@ -1283,13 +2095,16 @@ "OCRNL": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "OFDEL": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "off_t": {"id_type":"type", "header":"stdio.h", "extensions":["CX"]}, + "offset": {"id_type":"field", "header":"stropts.h", "extensions":[]}, "offsetof": {"id_type":"macro", "header":"stddef.h", "extensions":[]}, "OFILL": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "OLCUC": {"id_type":"constant", "header":"termios.h", "extensions":["REM"]}, "OLD_TIME": {"id_type":"constant", "header":"utmpx.h", "extensions":[]}, "ONLCR": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "ONLRET": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "ONOCR": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "open": {"id_type":"function", "header":"fcntl.h", "extensions":["ADV"], "notes":{"variadic-plugin":true}}, + "OPEN_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "open_memstream": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "open_wmemstream": {"id_type":"function", "header":"wchar.h", "extensions":[]}, "openat": {"id_type":"function", "header":"fcntl.h", "extensions":[], "notes":{"variadic-plugin":true}}, @@ -1302,18 +2117,40 @@ "optopt": {"id_type":"variable", "header":"unistd.h", "extensions":[]}, "or": {"id_type":"macro", "header":"iso646.h", "extensions":["XSI"]}, "or_eq": {"id_type":"macro", "header":"iso646.h", "extensions":[]}, + "p_aliases": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "P_ALL": {"id_type":"field", "header":"sys/wait.h", "extensions":[]}, + "p_cs_precedes": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "p_name": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "P_PGID": {"id_type":"field", "header":"sys/wait.h", "extensions":[]}, + "P_PID": {"id_type":"field", "header":"sys/wait.h", "extensions":[]}, + "p_proto": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "p_sep_by_space": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "p_sign_posn": {"id_type":"field", "header":"locale.h", "extensions":[]}, "P_tmpdir": {"id_type":"macro", "header":"stdio.h", "extensions":[]}, + "PAGE_SIZE": {"id_type":"constant", "header":"limits.h", "extensions":["XSI"]}, + "PAGESIZE": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "PARENB": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "PARMRK": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "PARODD": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "PASS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":["REM"]}, "passwd": {"id_type":"type", "header":"pwd.h", "extensions":["XSI"]}, + "PATH_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "pathconf": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "pause": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "pclose": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]}, + "PENDIN": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, "perror": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "pid_t": {"id_type":"type", "header":"signal.h", "extensions":["PS"]}, "pipe": {"id_type":"function", "header":"unistd.h", "extensions":[]}, + "PIPE_BUF": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "PM_STR": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, "poll": {"id_type":"function", "header":"poll.h", "extensions":[]}, + "POLL_ERR": {"id_type":"constant", "header":"signal.h", "extensions":["OB", "XSR"]}, + "POLL_HUP": {"id_type":"constant", "header":"signal.h", "extensions":["OB", "XSR"]}, + "POLL_IN": {"id_type":"constant", "header":"signal.h", "extensions":["OB", "XSR"]}, + "POLL_MSG": {"id_type":"constant", "header":"signal.h", "extensions":["OB", "XSR"]}, + "POLL_OUT": {"id_type":"constant", "header":"signal.h", "extensions":["OB", "XSR"]}, + "POLL_PRI": {"id_type":"constant", "header":"signal.h", "extensions":["OB", "XSR"]}, "POLLERR": {"id_type":"constant", "header":"poll.h", "extensions":[]}, "pollfd": {"id_type":"type", "header":"poll.h", "extensions":[]}, "POLLHUP": {"id_type":"constant", "header":"poll.h", "extensions":[]}, @@ -1326,6 +2163,10 @@ "POLLWRBAND": {"id_type":"constant", "header":"poll.h", "extensions":[]}, "POLLWRNORM": {"id_type":"constant", "header":"poll.h", "extensions":[]}, "popen": {"id_type":"function", "header":"stdio.h", "extensions":[]}, + "positive_sign": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "POSIX2_SYMLINKS": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "POSIX_ALLOC_SIZE_MIN": {"id_type":"constant", "header":"limits.h", "extensions":["ADV"]}, + "posix_event_id": {"id_type":"field", "header":"trace.h", "extensions":[]}, "POSIX_FADV_DONTNEED": {"id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]}, "POSIX_FADV_NOREUSE": {"id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]}, "POSIX_FADV_NORMAL": {"id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]}, @@ -1334,16 +2175,36 @@ "POSIX_FADV_WILLNEED": {"id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]}, "posix_fadvise": {"id_type":"function", "header":"fcntl.h", "extensions":["ADV"]}, "posix_fallocate": {"id_type":"function", "header":"fcntl.h", "extensions":["ADV"]}, + "posix_log_full_status": {"id_type":"field", "header":"trace.h", "extensions":["OB", "TRL"]}, + "posix_log_overrun_status": {"id_type":"field", "header":"trace.h", "extensions":["OB", "TRL"]}, + "POSIX_MADV_DONTNEED": {"id_type":"constant", "header":"sys/mman.h", "extensions":["ADV"]}, + "POSIX_MADV_NORMAL": {"id_type":"constant", "header":"sys/mman.h", "extensions":["ADV"]}, + "POSIX_MADV_RANDOM": {"id_type":"constant", "header":"sys/mman.h", "extensions":["ADV"]}, + "POSIX_MADV_SEQUENTIAL": {"id_type":"constant", "header":"sys/mman.h", "extensions":["ADV"]}, + "POSIX_MADV_WILLNEED": {"id_type":"constant", "header":"sys/mman.h", "extensions":["ADV"]}, "posix_madvise": {"id_type":"function", "header":"sys/mman.h", "extensions":["ADV"]}, "posix_mem_offset": {"id_type":"function", "header":"sys/mman.h", "extensions":["TYM"]}, "posix_memalign": {"id_type":"function", "header":"stdlib.h", "extensions":["ADV"]}, "posix_openpt": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, + "posix_pid": {"id_type":"field", "header":"trace.h", "extensions":[]}, + "posix_prog_address": {"id_type":"field", "header":"trace.h", "extensions":[]}, + "POSIX_REC_INCR_XFER_SIZE": {"id_type":"constant", "header":"limits.h", "extensions":["ADV"]}, + "POSIX_REC_MAX_XFER_SIZE": {"id_type":"constant", "header":"limits.h", "extensions":["ADV"]}, + "POSIX_REC_MIN_XFER_SIZE": {"id_type":"constant", "header":"limits.h", "extensions":["ADV"]}, + "POSIX_REC_XFER_ALIGN": {"id_type":"constant", "header":"limits.h", "extensions":["ADV"]}, "posix_spawn": {"id_type":"function", "header":"spawn.h", "extensions":[]}, "posix_spawn_file_actions_addclose": {"id_type":"function", "header":"spawn.h", "extensions":[]}, "posix_spawn_file_actions_adddup2": {"id_type":"function", "header":"spawn.h", "extensions":[]}, "posix_spawn_file_actions_addopen": {"id_type":"function", "header":"spawn.h", "extensions":[]}, "posix_spawn_file_actions_destroy": {"id_type":"function", "header":"spawn.h", "extensions":[]}, "posix_spawn_file_actions_init": {"id_type":"function", "header":"spawn.h", "extensions":[]}, + "posix_spawn_file_actions_t": {"id_type":"type", "header":"spawn.h", "extensions":[]}, + "POSIX_SPAWN_RESETIDS": {"id_type":"constant", "header":"spawn.h", "extensions":[]}, + "POSIX_SPAWN_SETPGROUP": {"id_type":"constant", "header":"spawn.h", "extensions":[]}, + "POSIX_SPAWN_SETSCHEDPARAM": {"id_type":"constant", "header":"spawn.h", "extensions":["PS"]}, + "POSIX_SPAWN_SETSCHEDULER": {"id_type":"constant", "header":"spawn.h", "extensions":["PS"]}, + "POSIX_SPAWN_SETSIGDEF": {"id_type":"constant", "header":"spawn.h", "extensions":[]}, + "POSIX_SPAWN_SETSIGMASK": {"id_type":"constant", "header":"spawn.h", "extensions":[]}, "posix_spawnattr_destroy": {"id_type":"function", "header":"spawn.h", "extensions":[]}, "posix_spawnattr_getflags": {"id_type":"function", "header":"spawn.h", "extensions":[]}, "posix_spawnattr_getpgroup": {"id_type":"function", "header":"spawn.h", "extensions":[]}, @@ -1358,7 +2219,18 @@ "posix_spawnattr_setschedpolicy": {"id_type":"function", "header":"spawn.h", "extensions":["PS"]}, "posix_spawnattr_setsigdefault": {"id_type":"function", "header":"spawn.h", "extensions":[]}, "posix_spawnattr_setsigmask": {"id_type":"function", "header":"spawn.h", "extensions":[]}, + "posix_spawnattr_t": {"id_type":"type", "header":"spawn.h", "extensions":[]}, "posix_spawnp": {"id_type":"function", "header":"spawn.h", "extensions":[]}, + "posix_stream_flush_error": {"id_type":"field", "header":"trace.h", "extensions":["OB", "TRL"]}, + "posix_stream_flush_status": {"id_type":"field", "header":"trace.h", "extensions":["OB", "TRL"]}, + "posix_stream_full_status": {"id_type":"field", "header":"trace.h", "extensions":[]}, + "posix_stream_overrun_status": {"id_type":"field", "header":"trace.h", "extensions":[]}, + "posix_stream_status": {"id_type":"field", "header":"trace.h", "extensions":[]}, + "posix_thread_id": {"id_type":"field", "header":"trace.h", "extensions":[]}, + "posix_timestamp": {"id_type":"field", "header":"trace.h", "extensions":[]}, + "posix_tmi_length": {"id_type":"field", "header":"sys/mman.h", "extensions":["TYM"]}, + "POSIX_TRACE_ALL_EVENTS": {"id_type":"constant", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_APPEND": {"id_type":"constant", "header":"trace.h", "extensions":["OB", "TRL"]}, "posix_trace_attr_destroy": {"id_type":"function", "header":"trace.h", "extensions":[]}, "posix_trace_attr_getclockres": {"id_type":"function", "header":"trace.h", "extensions":[]}, "posix_trace_attr_getcreatetime": {"id_type":"function", "header":"trace.h", "extensions":[]}, @@ -1382,6 +2254,7 @@ "posix_trace_attr_setstreamsize": {"id_type":"function", "header":"trace.h", "extensions":[]}, "posix_trace_clear": {"id_type":"function", "header":"trace.h", "extensions":[]}, "posix_trace_close": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]}, + "POSIX_TRACE_CLOSE_FOR_CHILD": {"id_type":"constant", "header":"trace.h", "extensions":["OB", "TRI"]}, "posix_trace_create": {"id_type":"function", "header":"trace.h", "extensions":[]}, "posix_trace_create_withlog": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]}, "posix_trace_event": {"id_type":"function", "header":"trace.h", "extensions":[]}, @@ -1396,35 +2269,147 @@ "posix_trace_eventset_ismember": {"id_type":"function", "header":"trace.h", "extensions":["TEF"]}, "posix_trace_eventtypelist_getnext_id": {"id_type":"function", "header":"trace.h", "extensions":[]}, "posix_trace_eventtypelist_rewind": {"id_type":"function", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_FILTER": {"id_type":"constant", "header":"trace.h", "extensions":["OB", "TEF"]}, + "POSIX_TRACE_FLUSH": {"id_type":"constant", "header":"trace.h", "extensions":["OB", "TRL"]}, "posix_trace_flush": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]}, + "POSIX_TRACE_FLUSH_START": {"id_type":"constant", "header":"trace.h", "extensions":["OB", "TRL"]}, + "POSIX_TRACE_FLUSH_STOP": {"id_type":"constant", "header":"trace.h", "extensions":["OB", "TRL"]}, + "POSIX_TRACE_FLUSHING": {"id_type":"constant", "header":"trace.h", "extensions":["OB", "TRL"]}, + "POSIX_TRACE_FULL": {"id_type":"constant", "header":"trace.h", "extensions":[]}, "posix_trace_get_attr": {"id_type":"function", "header":"trace.h", "extensions":[]}, "posix_trace_get_filter": {"id_type":"function", "header":"trace.h", "extensions":["TEF"]}, "posix_trace_get_status": {"id_type":"function", "header":"trace.h", "extensions":[]}, "posix_trace_getnext_event": {"id_type":"function", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_INHERITED": {"id_type":"constant", "header":"trace.h", "extensions":["OB", "TRI"]}, + "POSIX_TRACE_LOOP": {"id_type":"constant", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_NO_OVERRUN": {"id_type":"constant", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_NOT_FLUSHING": {"id_type":"constant", "header":"trace.h", "extensions":["OB", "TRL"]}, + "POSIX_TRACE_NOT_FULL": {"id_type":"constant", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_NOT_TRUNCATED": {"id_type":"constant", "header":"trace.h", "extensions":[]}, "posix_trace_open": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]}, + "POSIX_TRACE_OVERFLOW": {"id_type":"constant", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_OVERRUN": {"id_type":"constant", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_RESUME": {"id_type":"constant", "header":"trace.h", "extensions":[]}, "posix_trace_rewind": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]}, + "POSIX_TRACE_RUNNING": {"id_type":"constant", "header":"trace.h", "extensions":[]}, "posix_trace_set_filter": {"id_type":"function", "header":"trace.h", "extensions":["TEF"]}, "posix_trace_shutdown": {"id_type":"function", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_START": {"id_type":"constant", "header":"trace.h", "extensions":[]}, "posix_trace_start": {"id_type":"function", "header":"trace.h", "extensions":[]}, "posix_trace_status_info": {"id_type":"type", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_STOP": {"id_type":"constant", "header":"trace.h", "extensions":[]}, "posix_trace_stop": {"id_type":"function", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_SUSPENDED": {"id_type":"constant", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_SYSTEM_EVENTS": {"id_type":"constant", "header":"trace.h", "extensions":[]}, "posix_trace_timedgetnext_event": {"id_type":"function", "header":"trace.h", "extensions":[]}, "posix_trace_trid_eventid_open": {"id_type":"function", "header":"trace.h", "extensions":["TEF"]}, + "POSIX_TRACE_TRUNCATED_READ": {"id_type":"constant", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_TRUNCATED_RECORD": {"id_type":"constant", "header":"trace.h", "extensions":[]}, "posix_trace_trygetnext_event": {"id_type":"function", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_UNNAMED_USER_EVENT": {"id_type":"constant", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_UNTIL_FULL": {"id_type":"constant", "header":"trace.h", "extensions":[]}, + "POSIX_TRACE_WOPID_EVENTS": {"id_type":"constant", "header":"trace.h", "extensions":[]}, + "posix_truncation_status": {"id_type":"field", "header":"trace.h", "extensions":[]}, "POSIX_TYPED_MEM_ALLOCATE": {"id_type":"constant", "header":"sys/mman.h", "extensions":["TYM"]}, "POSIX_TYPED_MEM_ALLOCATE_CONTIG": {"id_type":"constant", "header":"sys/mman.h", "extensions":["TYM"]}, "posix_typed_mem_get_info": {"id_type":"function", "header":"sys/mman.h", "extensions":["TYM"]}, "posix_typed_mem_info": {"id_type":"type", "header":"sys/mman.h", "extensions":["TYM"]}, "POSIX_TYPED_MEM_MAP_ALLOCATABLE": {"id_type":"constant", "header":"sys/mman.h", "extensions":["TYM"]}, "posix_typed_mem_open": {"id_type":"function", "header":"sys/mman.h", "extensions":["TYM"]}, + "postorder": {"id_type":"field", "header":"search.h", "extensions":[]}, "pow": {"id_type":"function", "header":"math.h", "extensions":[]}, "powf": {"id_type":"function", "header":"math.h", "extensions":[]}, "powl": {"id_type":"function", "header":"math.h", "extensions":[]}, "pread": {"id_type":"function", "header":"unistd.h", "extensions":[]}, + "preorder": {"id_type":"field", "header":"search.h", "extensions":[]}, + "PRId16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRId32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRId64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRId8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIdFAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIdFAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIdFAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIdFAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIdLEAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIdLEAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIdLEAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIdLEAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIdMAX": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIdPTR": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIi16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIi32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIi64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIi8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIiFAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIiFAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIiFAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIiFAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIiLEAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIiLEAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIiLEAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIiLEAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIiMAX": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIiPTR": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, "printf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}}, + "PRIo16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIo32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIo64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIo8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, "PRIO_PGRP": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]}, "PRIO_PROCESS": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]}, "PRIO_USER": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]}, + "PRIoFAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIoFAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIoFAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIoFAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIoLEAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIoLEAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIoLEAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIoLEAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIoMAX": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIoPTR": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIu16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIu32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIu64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIu8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIuFAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIuFAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIuFAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIuFAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIuLEAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIuLEAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIuLEAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIuLEAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIuMAX": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIuPTR": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIx16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIX16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIx32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIX32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIx64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIX64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIx8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIX8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIxFAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIXFAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIxFAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIXFAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIxFAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIXFAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIxFAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIXFAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIxLEAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIXLEAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIxLEAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIXLEAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIxLEAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIXLEAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIxLEAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIXLEAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIxMAX": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIXMAX": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIxPTR": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "PRIXPTR": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, "PROT_EXEC": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]}, "PROT_NONE": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]}, "PROT_READ": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]}, @@ -1442,6 +2427,7 @@ "pthread_attr_getschedpolicy": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]}, "pthread_attr_getscope": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]}, "pthread_attr_getstack": {"id_type":"function", "header":"pthread.h", "extensions":["TSA","TSS"]}, + "pthread_attr_getstackaddr": {"id_type":"function", "header":"pthread.h", "extensions":["REM"]}, "pthread_attr_getstacksize": {"id_type":"function", "header":"pthread.h", "extensions":["TSS"]}, "pthread_attr_init": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_attr_setdetachstate": {"id_type":"function", "header":"pthread.h", "extensions":[]}, @@ -1451,10 +2437,12 @@ "pthread_attr_setschedpolicy": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]}, "pthread_attr_setscope": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]}, "pthread_attr_setstack": {"id_type":"function", "header":"pthread.h", "extensions":["TSA","TSS"]}, + "pthread_attr_setstackaddr": {"id_type":"function", "header":"pthread.h", "extensions":["REM"]}, "pthread_attr_setstacksize": {"id_type":"function", "header":"pthread.h", "extensions":["TSS"]}, "pthread_attr_t": {"id_type":"type", "header":"sys/types.h", "extensions":["TPS"]}, "pthread_barrier_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_barrier_init": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_BARRIER_SERIAL_THREAD": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, "pthread_barrier_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, "pthread_barrier_wait": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_barrierattr_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]}, @@ -1463,11 +2451,17 @@ "pthread_barrierattr_setpshared": {"id_type":"function", "header":"pthread.h", "extensions":["TSH"]}, "pthread_barrierattr_t": {"id_type":"type", "header":"sys/types.h", "extensions":["TSH"]}, "pthread_cancel": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_CANCEL_ASYNCHRONOUS": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, + "PTHREAD_CANCEL_DEFERRED": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, + "PTHREAD_CANCEL_DISABLE": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, + "PTHREAD_CANCEL_ENABLE": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, + "PTHREAD_CANCELED": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, "pthread_cleanup_pop": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_cleanup_push": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_cond_broadcast": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_cond_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_cond_init": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_COND_INITIALIZER": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, "pthread_cond_signal": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_cond_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, "pthread_cond_timedwait": {"id_type":"function", "header":"pthread.h", "extensions":[]}, @@ -1480,24 +2474,37 @@ "pthread_condattr_setpshared": {"id_type":"function", "header":"pthread.h", "extensions":["TSH"]}, "pthread_condattr_t": {"id_type":"type", "header":"sys/types.h", "extensions":["TSH"]}, "pthread_create": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_CREATE_DETACHED": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, + "PTHREAD_CREATE_JOINABLE": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, + "PTHREAD_DESTRUCTOR_ITERATIONS": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "pthread_detach": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_equal": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_exit": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_EXPLICIT_SCHED": {"id_type":"constant", "header":"pthread.h", "extensions":["TPS"]}, "pthread_getconcurrency": {"id_type":"function", "header":"pthread.h", "extensions":["OB","XSI"]}, "pthread_getcpuclockid": {"id_type":"function", "header":"pthread.h", "extensions":["TCT"]}, "pthread_getschedparam": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]}, "pthread_getspecific": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_INHERIT_SCHED": {"id_type":"constant", "header":"pthread.h", "extensions":["TPS"]}, "pthread_join": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_key_create": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_key_delete": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_key_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, + "PTHREAD_KEYS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "pthread_kill": {"id_type":"function", "header":"signal.h", "extensions":[]}, "pthread_mutex_consistent": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_MUTEX_DEFAULT": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, "pthread_mutex_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_MUTEX_ERRORCHECK": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, "pthread_mutex_getprioceiling": {"id_type":"function", "header":"pthread.h", "extensions":["RPP","TPP"]}, "pthread_mutex_init": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_MUTEX_INITIALIZER": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, "pthread_mutex_lock": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_MUTEX_NORMAL": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, + "PTHREAD_MUTEX_RECURSIVE": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, + "PTHREAD_MUTEX_ROBUST": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, "pthread_mutex_setprioceiling": {"id_type":"function", "header":"pthread.h", "extensions":["RPP","TPP"]}, + "PTHREAD_MUTEX_STALLED": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, "pthread_mutex_t": {"id_type":"type", "header":"sys/types.h", "extensions":["RPP","TPP"]}, "pthread_mutex_timedlock": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_mutex_trylock": {"id_type":"function", "header":"pthread.h", "extensions":[]}, @@ -1516,9 +2523,16 @@ "pthread_mutexattr_settype": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_mutexattr_t": {"id_type":"type", "header":"sys/types.h", "extensions":["RPP","TPP"]}, "pthread_once": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_ONCE_INIT": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, "pthread_once_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, + "PTHREAD_PRIO_INHERIT": {"id_type":"constant", "header":"pthread.h", "extensions":["RPI", "TPI"]}, + "PTHREAD_PRIO_NONE": {"id_type":"constant", "header":"pthread.h", "extensions":["MC1"]}, + "PTHREAD_PRIO_PROTECT": {"id_type":"constant", "header":"pthread.h", "extensions":["RPP", "TPP"]}, + "PTHREAD_PROCESS_PRIVATE": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, + "PTHREAD_PROCESS_SHARED": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, "pthread_rwlock_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_rwlock_init": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_RWLOCK_INITIALIZER": {"id_type":"constant", "header":"pthread.h", "extensions":[]}, "pthread_rwlock_rdlock": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_rwlock_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, "pthread_rwlock_timedrdlock": {"id_type":"function", "header":"pthread.h", "extensions":[]}, @@ -1532,6 +2546,8 @@ "pthread_rwlockattr_init": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_rwlockattr_setpshared": {"id_type":"function", "header":"pthread.h", "extensions":["TSH"]}, "pthread_rwlockattr_t": {"id_type":"type", "header":"sys/types.h", "extensions":["TSH"]}, + "PTHREAD_SCOPE_PROCESS": {"id_type":"constant", "header":"pthread.h", "extensions":["TPS"]}, + "PTHREAD_SCOPE_SYSTEM": {"id_type":"constant", "header":"pthread.h", "extensions":["TPS"]}, "pthread_self": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_setcancelstate": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_setcanceltype": {"id_type":"function", "header":"pthread.h", "extensions":[]}, @@ -1546,8 +2562,12 @@ "pthread_spin_trylock": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_spin_unlock": {"id_type":"function", "header":"pthread.h", "extensions":[]}, "pthread_spinlock_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, + "PTHREAD_STACK_MIN": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "pthread_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, "pthread_testcancel": {"id_type":"function", "header":"pthread.h", "extensions":[]}, + "PTHREAD_THREADS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "PTRDIFF_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "PTRDIFF_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, "ptrdiff_t": {"id_type":"macro", "header":"stddef.h", "extensions":[]}, "ptsname": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "putc": {"id_type":"function", "header":"stdio.h", "extensions":[]}, @@ -1561,14 +2581,22 @@ "pututxline": {"id_type":"function", "header":"utmpx.h", "extensions":[]}, "putwc": {"id_type":"function", "header":"wchar.h", "extensions":[]}, "putwchar": {"id_type":"function", "header":"wchar.h", "extensions":[]}, + "pw_dir": {"id_type":"field", "header":"pwd.h", "extensions":[]}, + "pw_gid": {"id_type":"field", "header":"pwd.h", "extensions":[]}, + "pw_name": {"id_type":"field", "header":"pwd.h", "extensions":[]}, + "pw_shell": {"id_type":"field", "header":"pwd.h", "extensions":[]}, + "pw_uid": {"id_type":"field", "header":"pwd.h", "extensions":[]}, "pwrite": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "qsort": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "R_OK": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "RADIXCHAR": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, "raise": {"id_type":"function", "header":"signal.h", "extensions":[]}, "rand": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "RAND_MAX": {"id_type":"macro", "header":"stdlib.h", "extensions":[]}, "rand_r": {"id_type":"function", "header":"stdlib.h", "extensions":["OB","CX"]}, "random": {"id_type":"function", "header":"stdlib.h", "extensions":["ADV"]}, + "RE_DUP_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "re_nsub": {"id_type":"field", "header":"regex.h", "extensions":[]}, "read": {"id_type":"function", "header":"unistd.h", "extensions":["OB","XSR"]}, "readdir": {"id_type":"function", "header":"dirent.h", "extensions":[]}, "readdir_r": {"id_type":"function", "header":"dirent.h", "extensions":[]}, @@ -1577,9 +2605,9 @@ "readv": {"id_type":"function", "header":"sys/uio.h", "extensions":["XSI"]}, "realloc": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "realpath": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, - "recv": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, - "recvfrom": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, - "recvmsg": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, + "recv": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, + "recvfrom": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, + "recvmsg": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, "REG_BADBR": {"id_type":"constant", "header":"regex.h", "extensions":[]}, "REG_BADPAT": {"id_type":"constant", "header":"regex.h", "extensions":[]}, "REG_BADRPT": {"id_type":"constant", "header":"regex.h", "extensions":[]}, @@ -1588,6 +2616,7 @@ "REG_ECOLLATE": {"id_type":"constant", "header":"regex.h", "extensions":[]}, "REG_ECTYPE": {"id_type":"constant", "header":"regex.h", "extensions":[]}, "REG_EESCAPE": {"id_type":"constant", "header":"regex.h", "extensions":[]}, + "REG_ENOSYS": {"id_type":"constant", "header":"regex.h", "extensions":["REM"]}, "REG_EPAREN": {"id_type":"constant", "header":"regex.h", "extensions":[]}, "REG_ERANGE": {"id_type":"constant", "header":"regex.h", "extensions":[]}, "REG_ESPACE": {"id_type":"constant", "header":"regex.h", "extensions":[]}, @@ -1599,13 +2628,17 @@ "REG_NOSUB": {"id_type":"constant", "header":"regex.h", "extensions":[]}, "REG_NOTBOL": {"id_type":"constant", "header":"regex.h", "extensions":[]}, "REG_NOTEOL": {"id_type":"constant", "header":"regex.h", "extensions":[]}, + "regcmp": {"id_type":"function", "header":"libgen.h", "extensions":["REM"]}, "regcomp": {"id_type":"function", "header":"regex.h", "extensions":[]}, "regerror": {"id_type":"function", "header":"regex.h", "extensions":[]}, + "regex": {"id_type":"function", "header":"libgen.h", "extensions":["REM"]}, "regex_t": {"id_type":"type", "header":"regex.h", "extensions":[]}, "regexec": {"id_type":"function", "header":"regex.h", "extensions":[]}, "regfree": {"id_type":"function", "header":"regex.h", "extensions":[]}, "regmatch_t": {"id_type":"type", "header":"regex.h", "extensions":[]}, "regoff_t": {"id_type":"type", "header":"regex.h", "extensions":[]}, + "REGTYPE": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "release": {"id_type":"field", "header":"sys/utsname.h", "extensions":[]}, "remainder": {"id_type":"function", "header":"math.h", "extensions":[]}, "remainderf": {"id_type":"function", "header":"math.h", "extensions":[]}, "remainderl": {"id_type":"function", "header":"math.h", "extensions":[]}, @@ -1616,12 +2649,16 @@ "remquol": {"id_type":"function", "header":"math.h", "extensions":[]}, "rename": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "renameat": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]}, + "revents": {"id_type":"field", "header":"poll.h", "extensions":[]}, "rewind": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "rewinddir": {"id_type":"function", "header":"dirent.h", "extensions":[]}, + "rindex": {"id_type":"function", "header":"strings.h", "extensions":["REM"]}, "rint": {"id_type":"function", "header":"math.h", "extensions":[]}, "rintf": {"id_type":"function", "header":"math.h", "extensions":[]}, "rintl": {"id_type":"function", "header":"math.h", "extensions":[]}, + "rlim_cur": {"id_type":"field", "header":"sys/resource.h", "extensions":[]}, "RLIM_INFINITY": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]}, + "rlim_max": {"id_type":"field", "header":"sys/resource.h", "extensions":[]}, "RLIM_SAVED_CUR": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]}, "RLIM_SAVED_MAX": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]}, "rlim_t": {"id_type":"type", "header":"sys/resource.h", "extensions":[]}, @@ -1633,21 +2670,95 @@ "RLIMIT_FSIZE": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]}, "RLIMIT_NOFILE": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]}, "RLIMIT_STACK": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]}, + "rm_eo": {"id_type":"field", "header":"regex.h", "extensions":[]}, + "rm_so": {"id_type":"field", "header":"regex.h", "extensions":[]}, "rmdir": {"id_type":"function", "header":"unistd.h", "extensions":[]}, + "RMSGD": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "RMSGN": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "RNORM": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, "round": {"id_type":"function", "header":"math.h", "extensions":[]}, "roundf": {"id_type":"function", "header":"math.h", "extensions":[]}, "roundl": {"id_type":"function", "header":"math.h", "extensions":[]}, + "RPROTDAT": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "RPROTDIS": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "RPROTNORM": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "RS_HIPRI": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "RTLD_GLOBAL": {"id_type":"constant", "header":"dlfcn.h", "extensions":[]}, + "RTLD_LAZY": {"id_type":"constant", "header":"dlfcn.h", "extensions":[]}, + "RTLD_LOCAL": {"id_type":"constant", "header":"dlfcn.h", "extensions":[]}, + "RTLD_NOW": {"id_type":"constant", "header":"dlfcn.h", "extensions":[]}, + "RTSIG_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "ru_stime": {"id_type":"field", "header":"sys/resource.h", "extensions":[]}, + "ru_utime": {"id_type":"field", "header":"sys/resource.h", "extensions":[]}, "rusage": {"id_type":"type", "header":"sys/resource.h", "extensions":[]}, "RUSAGE_CHILDREN": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]}, "RUSAGE_SELF": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]}, + "s6_addr": {"id_type":"field", "header":"netinet/in.h", "extensions":["IP6"]}, + "s_addr": {"id_type":"field", "header":"netinet/in.h", "extensions":[]}, + "s_aliases": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "S_BANDURG": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "S_ERROR": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "S_HANGUP": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "S_HIPRI": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "S_IFBLK": {"id_type":"constant", "header":"sys/stat.h", "extensions":["XSI"]}, + "S_IFCHR": {"id_type":"constant", "header":"sys/stat.h", "extensions":["XSI"]}, + "S_IFDIR": {"id_type":"constant", "header":"sys/stat.h", "extensions":["XSI"]}, + "S_IFIFO": {"id_type":"constant", "header":"sys/stat.h", "extensions":["XSI"]}, + "S_IFLNK": {"id_type":"constant", "header":"sys/stat.h", "extensions":["XSI"]}, "S_IFMT": {"id_type":"constant", "header":"sys/stat.h", "extensions":["OB"]}, + "S_IFREG": {"id_type":"constant", "header":"sys/stat.h", "extensions":["XSI"]}, + "S_IFSOCK": {"id_type":"constant", "header":"sys/stat.h", "extensions":["XSI"]}, + "S_INPUT": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "S_IRGRP": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_IROTH": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_IRUSR": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_IRWXG": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_IRWXO": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_IRWXU": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_ISBLK": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "S_ISCHR": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "S_ISDIR": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "S_ISFIFO": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "S_ISGID": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_ISLNK": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "S_ISREG": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "S_ISSOCK": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "S_ISUID": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_ISVTX": {"id_type":"constant", "header":"sys/stat.h", "extensions":["XSI"]}, + "S_IWGRP": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_IWOTH": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_IWUSR": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_IXGRP": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_IXOTH": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_IXUSR": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "S_MSG": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "s_name": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "S_OUTPUT": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "s_port": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "s_proto": {"id_type":"field", "header":"netdb.h", "extensions":[]}, + "S_RDBAND": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "S_RDNORM": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "S_TYPEISMQ": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "S_TYPEISSEM": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "S_TYPEISSHM": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "S_TYPEISTMO": {"id_type":"macro", "header":"sys/stat.h", "extensions":["TYM"]}, + "S_WRBAND": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "S_WRNORM": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, + "sa_data": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "sa_family": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "sa_family_t": {"id_type":"type", "header":"sys/socket.h", "extensions":[]}, + "sa_flags": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "sa_handler": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "sa_mask": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, "SA_NOCLDSTOP": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "SA_NOCLDWAIT": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "SA_NODEFER": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "SA_ONSTACK": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "SA_RESETHAND": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "SA_RESTART": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "sa_sigaction": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, "SA_SIGINFO": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "sbrk": {"id_type":"function", "header":"unistd.h", "extensions":["REM"]}, "scalbln": {"id_type":"function", "header":"math.h", "extensions":[]}, "scalblnf": {"id_type":"function", "header":"math.h", "extensions":[]}, "scalblnl": {"id_type":"function", "header":"math.h", "extensions":[]}, @@ -1658,41 +2769,137 @@ "scanf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}}, "SCHAR_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]}, "SCHAR_MIN": {"id_type":"macro", "header":"limits.h", "extensions":[]}, + "SCHED_FIFO": {"id_type":"constant", "header":"sched.h", "extensions":["PS", "TPS"]}, "sched_get_priority_max": {"id_type":"function", "header":"sched.h", "extensions":["PS","TPS"]}, "sched_get_priority_min": {"id_type":"function", "header":"sched.h", "extensions":["PS","TPS"]}, "sched_getparam": {"id_type":"function", "header":"sched.h", "extensions":["PS"]}, "sched_getscheduler": {"id_type":"function", "header":"sched.h", "extensions":["PS"]}, + "SCHED_OTHER": {"id_type":"constant", "header":"sched.h", "extensions":["PS", "TPS"]}, "sched_param": {"id_type":"type", "header":"sched.h", "extensions":["TPS"]}, + "sched_priority": {"id_type":"field", "header":"sched.h", "extensions":[]}, + "SCHED_RR": {"id_type":"constant", "header":"sched.h", "extensions":["PS", "TSP"]}, "sched_rr_get_interval": {"id_type":"function", "header":"sched.h", "extensions":["PS","TPS"]}, "sched_setparam": {"id_type":"function", "header":"sched.h", "extensions":["PS"]}, "sched_setscheduler": {"id_type":"function", "header":"sched.h", "extensions":["PS"]}, + "SCHED_SPORADIC": {"id_type":"constant", "header":"sched.h", "extensions":["PS", "TPS"]}, + "sched_ss_init_budget": {"id_type":"field", "header":"sched.h", "extensions":["SS", "TSP"]}, + "sched_ss_low_priority": {"id_type":"field", "header":"sched.h", "extensions":["SS", "TSP"]}, + "sched_ss_max_repl": {"id_type":"field", "header":"sched.h", "extensions":["SS", "TSP"]}, + "sched_ss_repl_period": {"id_type":"field", "header":"sched.h", "extensions":["SS", "TSP"]}, "sched_yield": {"id_type":"function", "header":"sched.h", "extensions":[]}, - "SCM_RIGHTS": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, + "SCM_RIGHTS": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SCNd16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNd32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNd64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNd8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNdFAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNdFAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNdFAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNdFAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNdLEAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNdLEAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNdLEAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNdLEAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNdMAX": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNdPTR": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNi16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNi32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNi64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNi8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNiFAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNiFAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNiFAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNiFAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNiLEAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNiLEAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNiLEAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNiLEAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNiMAX": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNiPTR": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNo16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNo32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNo64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNo8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNoFAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNoFAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNoFAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNoFAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNoLEAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNoLEAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNoLEAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNoLEAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNoMAX": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNoPTR": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNu16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNu32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNu64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNu8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNuFAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNuFAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNuFAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNuFAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNuLEAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNuLEAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNuLEAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNuLEAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNuMAX": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNuPTR": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNx16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNx32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNx64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNx8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNxFAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNxFAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNxFAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNxFAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNxLEAST16": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNxLEAST32": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNxLEAST64": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNxLEAST8": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNxMAX": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, + "SCNxPTR": {"id_type":"macro", "header":"inttypes.h", "extensions":[]}, "seed48": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "SEEK_CUR": {"id_type":"macro", "header":"stdio.h", "extensions":[]}, "SEEK_END": {"id_type":"macro", "header":"stdio.h", "extensions":[]}, "SEEK_SET": {"id_type":"macro", "header":"stdio.h", "extensions":[]}, "seekdir": {"id_type":"function", "header":"dirent.h", "extensions":["XSI"]}, + "SEGV_ACCERR": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "SEGV_MAPERR": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, "select": {"id_type":"function", "header":"sys/select.h", "extensions":[]}, "sem_close": {"id_type":"function", "header":"semaphore.h", "extensions":[]}, + "sem_ctime": {"id_type":"field", "header":"sys/sem.h", "extensions":[]}, "sem_destroy": {"id_type":"function", "header":"semaphore.h", "extensions":[]}, + "SEM_FAILED": {"id_type":"constant", "header":"semaphore.h", "extensions":[]}, + "sem_flg": {"id_type":"field", "header":"sys/sem.h", "extensions":[]}, "sem_getvalue": {"id_type":"function", "header":"semaphore.h", "extensions":[]}, "sem_init": {"id_type":"function", "header":"semaphore.h", "extensions":[]}, + "sem_nsems": {"id_type":"field", "header":"sys/sem.h", "extensions":[]}, + "SEM_NSEMS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "sem_num": {"id_type":"field", "header":"sys/sem.h", "extensions":[]}, + "sem_op": {"id_type":"field", "header":"sys/sem.h", "extensions":[]}, "sem_open": {"id_type":"function", "header":"semaphore.h", "extensions":[]}, + "sem_otime": {"id_type":"field", "header":"sys/sem.h", "extensions":[]}, + "sem_perm": {"id_type":"field", "header":"sys/sem.h", "extensions":[]}, "sem_post": {"id_type":"function", "header":"semaphore.h", "extensions":[]}, + "sem_t": {"id_type":"type", "header":"semaphore.h", "extensions":[]}, "sem_timedwait": {"id_type":"function", "header":"semaphore.h", "extensions":[]}, "sem_trywait": {"id_type":"function", "header":"semaphore.h", "extensions":[]}, "SEM_UNDO": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]}, "sem_unlink": {"id_type":"function", "header":"semaphore.h", "extensions":[]}, + "SEM_VALUE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "sem_wait": {"id_type":"function", "header":"semaphore.h", "extensions":[]}, "sembuf": {"id_type":"type", "header":"sys/sem.h", "extensions":[]}, "semctl": {"id_type":"function", "header":"sys/sem.h", "extensions":[]}, "semget": {"id_type":"function", "header":"sys/sem.h", "extensions":[]}, "semid_ds": {"id_type":"type", "header":"sys/sem.h", "extensions":[]}, + "semncnt": {"id_type":"field", "header":"sys/sem.h", "extensions":[]}, "semop": {"id_type":"function", "header":"sys/sem.h", "extensions":[]}, - "send": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, - "sendmsg": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, - "sendto": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, + "sempid": {"id_type":"field", "header":"sys/sem.h", "extensions":[]}, + "semval": {"id_type":"field", "header":"sys/sem.h", "extensions":[]}, + "semzcnt": {"id_type":"field", "header":"sys/sem.h", "extensions":[]}, + "send": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, + "sendmsg": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, + "sendto": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, "servent": {"id_type":"type", "header":"netdb.h", "extensions":[]}, "SETALL": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]}, "setbuf": {"id_type":"function", "header":"stdio.h", "extensions":[]}, @@ -1702,7 +2909,7 @@ "setgid": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "setgrent": {"id_type":"function", "header":"grp.h", "extensions":["XSI"]}, "sethostent": {"id_type":"function", "header":"netdb.h", "extensions":[]}, - "setitimer": {"id_type":"function", "header":"sys/time.h", "extensions":["IP6"]}, + "setitimer": {"id_type":"function", "header":"sys/time.h", "extensions":[]}, "setjmp": {"id_type":"function", "header":"setjmp.h", "extensions":[]}, "setkey": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, "setlocale": {"id_type":"function", "header":"locale.h", "extensions":[]}, @@ -1718,15 +2925,23 @@ "setrlimit": {"id_type":"function", "header":"sys/resource.h", "extensions":[]}, "setservent": {"id_type":"function", "header":"netdb.h", "extensions":[]}, "setsid": {"id_type":"function", "header":"unistd.h", "extensions":[]}, - "setsockopt": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, + "setsockopt": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, "setstate": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, "setuid": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "setutxent": {"id_type":"function", "header":"utmpx.h", "extensions":[]}, "SETVAL": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]}, "setvbuf": {"id_type":"function", "header":"stdio.h", "extensions":[]}, + "shm_atime": {"id_type":"field", "header":"sys/shm.h", "extensions":[]}, + "shm_cpid": {"id_type":"field", "header":"sys/shm.h", "extensions":[]}, + "shm_ctime": {"id_type":"field", "header":"sys/shm.h", "extensions":[]}, + "shm_dtime": {"id_type":"field", "header":"sys/shm.h", "extensions":[]}, + "shm_lpid": {"id_type":"field", "header":"sys/shm.h", "extensions":[]}, + "shm_nattch": {"id_type":"field", "header":"sys/shm.h", "extensions":[]}, "shm_open": {"id_type":"function", "header":"sys/mman.h", "extensions":["SHM"]}, + "shm_perm": {"id_type":"field", "header":"sys/shm.h", "extensions":[]}, "SHM_RDONLY": {"id_type":"constant", "header":"sys/shm.h", "extensions":[]}, "SHM_RND": {"id_type":"constant", "header":"sys/shm.h", "extensions":[]}, + "shm_segsz": {"id_type":"field", "header":"sys/shm.h", "extensions":[]}, "shm_unlink": {"id_type":"function", "header":"sys/mman.h", "extensions":["SHM"]}, "shmat": {"id_type":"function", "header":"sys/shm.h", "extensions":[]}, "shmatt_t": {"id_type":"type", "header":"sys/shm.h", "extensions":[]}, @@ -1737,10 +2952,26 @@ "SHMLBA": {"id_type":"constant", "header":"sys/shm.h", "extensions":[]}, "SHRT_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]}, "SHRT_MIN": {"id_type":"macro", "header":"limits.h", "extensions":[]}, - "SHUT_RD": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SHUT_RDWR": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SHUT_WR": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "shutdown": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, + "SHUT_RD": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SHUT_RDWR": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SHUT_WR": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "shutdown": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, + "si_addr": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "SI_ASYNCIO": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "si_band": {"id_type":"field", "header":"signal.h", "extensions":["OB", "XSR"]}, + "si_code": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "si_errno": {"id_type":"field", "header":"signal.h", "extensions":["XSI"]}, + "SI_MESGQ": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "si_pid": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "SI_QUEUE": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "si_signo": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "si_status": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "SI_TIMER": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "si_uid": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "SI_USER": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "si_value": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "SIG_ATOMIC_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "SIG_ATOMIC_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, "sig_atomic_t": {"id_type":"type", "header":"signal.h", "extensions":[]}, "SIG_BLOCK": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "SIG_DFL": {"id_type":"macro", "header":"signal.h", "extensions":[]}, @@ -1749,78 +2980,134 @@ "SIG_IGN": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "SIG_SETMASK": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "SIG_UNBLOCK": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SIGABRT": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "sigaction": {"id_type":"function", "header":"signal.h", "extensions":[]}, "sigaction": {"id_type":"type", "header":"signal.h", "extensions":[]}, "sigaddset": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "SIGALRM": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "sigaltstack": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "SIGBUS": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SIGCHLD": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SIGCONT": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "sigdelset": {"id_type":"function", "header":"signal.h", "extensions":[]}, "sigemptyset": {"id_type":"function", "header":"signal.h", "extensions":[]}, - "SIGEV_NONE": {"id_type":"constant", "header":"signal.h", "extensions":[]}, - "SIGEV_SIGNAL": {"id_type":"constant", "header":"signal.h", "extensions":[]}, - "SIGEV_THREAD": {"id_type":"constant", "header":"signal.h", "extensions":[]}, + "SIGEV_NONE": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "sigev_notify": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "sigev_notify_attributes": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "sigev_notify_function": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "SIGEV_SIGNAL": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "sigev_signo": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "SIGEV_THREAD": {"id_type":"constant", "header":"signal.h", "extensions":["CX"]}, + "sigev_value": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, "sigevent": {"id_type":"type", "header":"signal.h", "extensions":["CX"]}, "sigfillset": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "SIGFPE": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "sighold": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "SIGHUP": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "sigignore": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "SIGILL": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "siginfo_t": {"id_type":"type", "header":"signal.h", "extensions":[]}, + "SIGINT": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "siginterrupt": {"id_type":"function", "header":"signal.h", "extensions":[]}, "sigismember": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "sigjmp_buf": {"id_type":"type", "header":"setjmp.h", "extensions":["CX"]}, + "SIGKILL": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "siglongjmp": {"id_type":"function", "header":"setjmp.h", "extensions":["CX"]}, + "sigmask": {"id_type":"function", "header":"signal.h", "extensions":["REM"]}, "signal": {"id_type":"function", "header":"signal.h", "extensions":[]}, "signbit": {"id_type":"macro", "header":"math.h", "extensions":[]}, "signgam": {"id_type":"variable", "header":"math.h", "extensions":[]}, "sigpause": {"id_type":"function", "header":"signal.h", "extensions":[]}, "sigpending": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "SIGPIPE": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SIGPOLL": {"id_type":"macro", "header":"signal.h", "extensions":["OB", "XSR"]}, "sigprocmask": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "SIGPROF": {"id_type":"macro", "header":"signal.h", "extensions":["OB", "XSI"]}, "sigqueue": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "SIGQUEUE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "SIGQUIT": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "sigrelse": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "SIGRTMAX": {"id_type":"macro", "header":"signal.h", "extensions":["CX"]}, + "SIGRTMIN": {"id_type":"macro", "header":"signal.h", "extensions":["CX"]}, + "SIGSEGV": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "sigset": {"id_type":"function", "header":"signal.h", "extensions":[]}, "sigset_t": {"id_type":"type", "header":"signal.h", "extensions":[]}, "sigsetjmp": {"id_type":"function", "header":"setjmp.h", "extensions":["CX"]}, + "sigstack": {"id_type":"type", "header":"signal.h", "extensions":["REM"]}, "SIGSTKSZ": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SIGSTOP": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "sigsuspend": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "SIGSYS": {"id_type":"macro", "header":"signal.h", "extensions":["XSI"]}, + "SIGTERM": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "sigtimedwait": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "SIGTRAP": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SIGTSTP": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SIGTTIN": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SIGTTOU": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SIGURG": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SIGUSR1": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SIGUSR2": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "sigval": {"id_type":"type", "header":"signal.h", "extensions":[]}, + "SIGVTALRM": {"id_type":"macro", "header":"signal.h", "extensions":["XSI"]}, "sigwait": {"id_type":"function", "header":"signal.h", "extensions":[]}, "sigwaitinfo": {"id_type":"function", "header":"signal.h", "extensions":[]}, + "SIGXCPU": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SIGXFSZ": {"id_type":"macro", "header":"signal.h", "extensions":[]}, "sin": {"id_type":"function", "header":"math.h", "extensions":[]}, + "sin6_addr": {"id_type":"field", "header":"netinet/in.h", "extensions":["IP6"]}, + "sin6_family": {"id_type":"field", "header":"netinet/in.h", "extensions":["IP6"]}, + "sin6_flowinfo": {"id_type":"field", "header":"netinet/in.h", "extensions":["IP6"]}, + "sin6_port": {"id_type":"field", "header":"netinet/in.h", "extensions":["IP6"]}, + "sin6_scope_id": {"id_type":"field", "header":"netinet/in.h", "extensions":["IP6"]}, + "sin_addr": {"id_type":"field", "header":"netinet/in.h", "extensions":[]}, + "sin_family": {"id_type":"field", "header":"netinet/in.h", "extensions":[]}, + "sin_port": {"id_type":"field", "header":"netinet/in.h", "extensions":[]}, + "sin_zero": {"id_type":"field", "header":"netinet/in.h", "extensions":["REM"]}, "sinf": {"id_type":"function", "header":"math.h", "extensions":[]}, "sinh": {"id_type":"function", "header":"math.h", "extensions":[]}, "sinhf": {"id_type":"function", "header":"math.h", "extensions":[]}, "sinhl": {"id_type":"function", "header":"math.h", "extensions":[]}, "sinl": {"id_type":"function", "header":"math.h", "extensions":[]}, + "sival_int": {"id_type":"field", "header":"signal.h", "extensions":[]}, + "sival_ptr": {"id_type":"field", "header":"signal.h", "extensions":[]}, + "SIZE_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, "size_t": {"id_type":"macro", "header":"stddef.h", "extensions":["TSA","TSS"]}, + "sl_modlist": {"id_type":"field", "header":"stropts.h", "extensions":[]}, + "sl_nmods": {"id_type":"field", "header":"stropts.h", "extensions":[]}, "sleep": {"id_type":"function", "header":"unistd.h", "extensions":[]}, + "SNDZERO": {"id_type":"constant", "header":"stropts.h", "extensions":[]}, "snprintf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}}, - "SO_ACCEPTCONN": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_BROADCAST": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_DEBUG": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_DONTROUTE": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_ERROR": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_KEEPALIVE": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_LINGER": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_OOBINLINE": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_RCVBUF": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_RCVLOWAT": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_RCVTIMEO": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_REUSEADDR": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_SNDBUF": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_SNDLOWAT": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_SNDTIMEO": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SO_TYPE": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SOCK_DGRAM": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SOCK_RAW": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SOCK_SEQPACKET": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SOCK_STREAM": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "sockaddr": {"id_type":"type", "header":"sys/socket.h", "extensions":["IP6"]}, + "SO_ACCEPTCONN": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_BROADCAST": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_DEBUG": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_DONTROUTE": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_ERROR": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_KEEPALIVE": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_LINGER": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_OOBINLINE": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_RCVBUF": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_RCVLOWAT": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_RCVTIMEO": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_REUSEADDR": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_SNDBUF": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_SNDLOWAT": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_SNDTIMEO": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SO_TYPE": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SOCK_DGRAM": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SOCK_RAW": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SOCK_SEQPACKET": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SOCK_STREAM": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "sockaddr": {"id_type":"type", "header":"sys/socket.h", "extensions":[]}, "sockaddr_in": {"id_type":"type", "header":"netinet/in.h", "extensions":[]}, "sockaddr_in6": {"id_type":"type", "header":"netinet/in.h", "extensions":["IP6"]}, + "sockaddr_storage": {"id_type":"type", "header":"sys/socket.h", "extensions":[]}, "sockaddr_un": {"id_type":"type", "header":"sys/un.h", "extensions":[]}, - "sockatmark": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, - "socket": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, - "socketpair": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]}, - "SOL_SOCKET": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, - "SOMAXCONN": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]}, + "sockatmark": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, + "socket": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, + "socketpair": {"id_type":"function", "header":"sys/socket.h", "extensions":[]}, + "socklen_t": {"id_type":"type", "header":"sys/socket.h", "extensions":[]}, + "SOL_SOCKET": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, + "SOMAXCONN": {"id_type":"constant", "header":"sys/socket.h", "extensions":[]}, "speed_t": {"id_type":"type", "header":"termios.h", "extensions":[]}, "sprintf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}}, "sqrt": {"id_type":"function", "header":"math.h", "extensions":[]}, @@ -1830,12 +3117,35 @@ "srand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, "srandom": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, "SS_DISABLE": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "ss_family": {"id_type":"field", "header":"sys/socket.h", "extensions":[]}, + "ss_flags": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, "SS_ONSTACK": {"id_type":"macro", "header":"signal.h", "extensions":[]}, + "SS_REPL_MAX": {"id_type":"constant", "header":"limits.h", "extensions":["SS", "TSP"]}, + "ss_size": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "ss_sp": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, "sscanf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}}, "SSIZE_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]}, "ssize_t": {"id_type":"type", "header":"stdio.h", "extensions":["CX"]}, + "st_atim": {"id_type":"field", "header":"sys/stat.h", "extensions":[]}, + "st_atime": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "st_blksize": {"id_type":"field", "header":"sys/stat.h", "extensions":["XSI"]}, + "st_blocks": {"id_type":"field", "header":"sys/stat.h", "extensions":["XSI"]}, + "st_ctim": {"id_type":"field", "header":"sys/stat.h", "extensions":[]}, + "st_ctime": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "st_dev": {"id_type":"field", "header":"sys/stat.h", "extensions":[]}, + "st_gid": {"id_type":"field", "header":"sys/stat.h", "extensions":[]}, + "st_ino": {"id_type":"field", "header":"sys/stat.h", "extensions":[]}, + "ST_ISGID": {"id_type":"constant", "header":"sys/statvfs.h", "extensions":[]}, + "ST_ISUID": {"id_type":"constant", "header":"sys/statvfs.h", "extensions":[]}, + "st_mode": {"id_type":"field", "header":"sys/stat.h", "extensions":[]}, + "st_mtim": {"id_type":"field", "header":"sys/stat.h", "extensions":[]}, + "st_mtime": {"id_type":"macro", "header":"sys/stat.h", "extensions":[]}, + "st_nlink": {"id_type":"field", "header":"sys/stat.h", "extensions":[]}, "ST_NOSUID": {"id_type":"constant", "header":"sys/statvfs.h", "extensions":[]}, + "st_rdev": {"id_type":"field", "header":"sys/stat.h", "extensions":["XSI"]}, "ST_RDONLY": {"id_type":"constant", "header":"sys/statvfs.h", "extensions":[]}, + "st_size": {"id_type":"field", "header":"sys/stat.h", "extensions":["SHM", "TYM"]}, + "st_uid": {"id_type":"field", "header":"sys/stat.h", "extensions":[]}, "stack_t": {"id_type":"type", "header":"signal.h", "extensions":[]}, "stat": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]}, "stat": {"id_type":"type", "header":"sys/stat.h", "extensions":["OB"]}, @@ -1848,6 +3158,7 @@ "STDIN_FILENO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "stdout": {"id_type":"macro", "header":"stdio.h", "extensions":[]}, "STDOUT_FILENO": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "still": {"id_type":"field", "header":"sys/stat.h", "extensions":[]}, "stpcpy": {"id_type":"function", "header":"string.h", "extensions":[]}, "stpncpy": {"id_type":"function", "header":"string.h", "extensions":[]}, "str_list": {"id_type":"type", "header":"stropts.h", "extensions":[]}, @@ -1863,14 +3174,15 @@ "strcpy": {"id_type":"function", "header":"string.h", "extensions":[]}, "strcspn": {"id_type":"function", "header":"string.h", "extensions":[]}, "strdup": {"id_type":"function", "header":"string.h", "extensions":["XSI"]}, + "STREAM_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "strerror": {"id_type":"function", "header":"string.h", "extensions":[]}, "strerror_l": {"id_type":"function", "header":"string.h", "extensions":[]}, "strerror_r": {"id_type":"function", "header":"string.h", "extensions":["CX"]}, "strfdinsert": {"id_type":"type", "header":"stropts.h", "extensions":[]}, "strfmon": {"id_type":"function", "header":"monetary.h", "extensions":[]}, "strfmon_l": {"id_type":"function", "header":"monetary.h", "extensions":[]}, - "strftime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "strftime_l": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "strftime": {"id_type":"function", "header":"time.h", "extensions":[]}, + "strftime_l": {"id_type":"function", "header":"time.h", "extensions":[]}, "strioctl": {"id_type":"type", "header":"stropts.h", "extensions":[]}, "strlen": {"id_type":"function", "header":"string.h", "extensions":[]}, "strncasecmp": {"id_type":"function", "header":"strings.h", "extensions":[]}, @@ -1882,7 +3194,7 @@ "strnlen": {"id_type":"function", "header":"string.h", "extensions":["CX"]}, "strpbrk": {"id_type":"function", "header":"string.h", "extensions":[]}, "strpeek": {"id_type":"type", "header":"stropts.h", "extensions":[]}, - "strptime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "strptime": {"id_type":"function", "header":"time.h", "extensions":[]}, "strrchr": {"id_type":"function", "header":"string.h", "extensions":[]}, "strrecvfd": {"id_type":"type", "header":"stropts.h", "extensions":[]}, "strsignal": {"id_type":"function", "header":"string.h", "extensions":[]}, @@ -1901,18 +3213,31 @@ "strtoumax": {"id_type":"function", "header":"inttypes.h", "extensions":[]}, "strxfrm": {"id_type":"function", "header":"string.h", "extensions":[]}, "strxfrm_l": {"id_type":"function", "header":"string.h", "extensions":["CX"]}, + "sun_family": {"id_type":"field", "header":"sys/un.h", "extensions":[]}, + "sun_path": {"id_type":"field", "header":"sys/un.h", "extensions":[]}, "suseconds_t": {"id_type":"type", "header":"sys/types.h", "extensions":["XSI"]}, "swab": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]}, "swprintf": {"id_type":"function", "header":"wchar.h", "extensions":[], "notes":{"variadic-plugin":true}}, "swscanf": {"id_type":"function", "header":"wchar.h", "extensions":[], "notes":{"variadic-plugin":true}}, + "SWTCH": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, "symlink": {"id_type":"function", "header":"unistd.h", "extensions":[]}, + "SYMLINK_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "symlinkat": {"id_type":"function", "header":"unistd.h", "extensions":[]}, + "SYMLOOP_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "SYMTYPE": {"id_type":"constant", "header":"tar.h", "extensions":[]}, "sync": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]}, "sysconf": {"id_type":"function", "header":"unistd.h", "extensions":["ADV"]}, "syslog": {"id_type":"function", "header":"syslog.h", "extensions":[], "notes":{"variadic-plugin":true}}, - "system": {"id_type":"function", "header":"stdlib.h", "extensions":["IP6"]}, + "sysname": {"id_type":"field", "header":"sys/utsname.h", "extensions":[]}, + "system": {"id_type":"function", "header":"stdlib.h", "extensions":[]}, + "T_FMT": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "T_FMT_AMPM": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, "t_scalar_t": {"id_type":"type", "header":"stropts.h", "extensions":[]}, "t_uscalar_t": {"id_type":"type", "header":"stropts.h", "extensions":[]}, + "TAB0": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, + "TAB1": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, + "TAB2": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, + "TAB3": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, "TABDLY": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "tan": {"id_type":"function", "header":"math.h", "extensions":[]}, "tanf": {"id_type":"function", "header":"math.h", "extensions":[]}, @@ -1949,27 +3274,50 @@ "tgamma": {"id_type":"function", "header":"math.h", "extensions":[]}, "tgammaf": {"id_type":"function", "header":"math.h", "extensions":[]}, "tgammal": {"id_type":"function", "header":"math.h", "extensions":[]}, - "time": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "TGEXEC": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "TGREAD": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "TGWRITE": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "thousands_sep": {"id_type":"field", "header":"locale.h", "extensions":[]}, + "THOUSEP": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "time": {"id_type":"function", "header":"time.h", "extensions":[]}, "time_t": {"id_type":"type", "header":"sys/types.h", "extensions":["SS","TSP"]}, - "TIMER_ABSTIME": {"id_type":"constant", "header":"time.h", "extensions":["IP6"]}, - "timer_create": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "timer_delete": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "timer_getoverrun": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "timer_gettime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, - "timer_settime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "TIMER_ABSTIME": {"id_type":"constant", "header":"time.h", "extensions":[]}, + "timer_create": {"id_type":"function", "header":"time.h", "extensions":[]}, + "timer_delete": {"id_type":"function", "header":"time.h", "extensions":[]}, + "timer_getoverrun": {"id_type":"function", "header":"time.h", "extensions":[]}, + "timer_gettime": {"id_type":"function", "header":"time.h", "extensions":[]}, + "TIMER_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "timer_settime": {"id_type":"function", "header":"time.h", "extensions":[]}, "timer_t": {"id_type":"type", "header":"sys/types.h", "extensions":["CX"]}, "times": {"id_type":"function", "header":"sys/times.h", "extensions":["OB"]}, - "timespec": {"id_type":"type", "header":"time.h", "extensions":["IP6"]}, - "timeval": {"id_type":"type", "header":"sys/time.h", "extensions":["IP6"]}, - "timezone": {"id_type":"variable", "header":"time.h", "extensions":["IP6"]}, - "tm": {"id_type":"type", "header":"time.h", "extensions":["IP6"]}, - "TMP_MAX": {"id_type":"macro", "header":"stdio.h", "extensions":[]}, + "timespec": {"id_type":"type", "header":"time.h", "extensions":[]}, + "timeval": {"id_type":"type", "header":"sys/time.h", "extensions":[]}, + "timezone": {"id_type":"variable", "header":"time.h", "extensions":[]}, + "tm": {"id_type":"type", "header":"time.h", "extensions":[]}, + "tm_hour": {"id_type":"field", "header":"time.h", "extensions":[]}, + "tm_isdst": {"id_type":"field", "header":"time.h", "extensions":[]}, + "tm_mday": {"id_type":"field", "header":"time.h", "extensions":[]}, + "tm_min": {"id_type":"field", "header":"time.h", "extensions":[]}, + "tm_mon": {"id_type":"field", "header":"time.h", "extensions":[]}, + "tm_sec": {"id_type":"field", "header":"time.h", "extensions":[]}, + "tm_wday": {"id_type":"field", "header":"time.h", "extensions":[]}, + "tm_yday": {"id_type":"field", "header":"time.h", "extensions":[]}, + "tm_year": {"id_type":"field", "header":"time.h", "extensions":[]}, + "TMAGIC": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "TMAGLEN": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "TMP_MAX": {"id_type":"macro", "header":"stdio.h", "extensions":["OB", "XSI"]}, "tmpfile": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "tmpnam": {"id_type":"function", "header":"stdio.h", "extensions":["OB"]}, "tms": {"id_type":"type", "header":"sys/times.h", "extensions":["OB"]}, + "tms_cstime": {"id_type":"field", "header":"sys/times.h", "extensions":[]}, + "tms_cutime": {"id_type":"field", "header":"sys/times.h", "extensions":[]}, + "tms_stime": {"id_type":"field", "header":"sys/times.h", "extensions":[]}, + "tms_utime": {"id_type":"field", "header":"sys/times.h", "extensions":[]}, "toascii": {"id_type":"function", "header":"ctype.h", "extensions":["OB","XSI"]}, + "TOEXEC": {"id_type":"constant", "header":"tar.h", "extensions":[]}, "tolower": {"id_type":"function", "header":"ctype.h", "extensions":[]}, "tolower_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]}, + "TOREAD": {"id_type":"constant", "header":"tar.h", "extensions":[]}, "TOSTOP": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "toupper": {"id_type":"function", "header":"ctype.h", "extensions":[]}, "toupper_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]}, @@ -1977,27 +3325,90 @@ "towctrans_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]}, "towlower": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]}, "towlower_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]}, + "TOWRITE": {"id_type":"constant", "header":"tar.h", "extensions":[]}, "towupper": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]}, "towupper_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]}, "trace_attr_t": {"id_type":"type", "header":"sys/types.h", "extensions":["OB","TRC"]}, "trace_event_id_t": {"id_type":"type", "header":"sys/types.h", "extensions":["OB","TRC"]}, + "TRACE_EVENT_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":["OB", "TRC"]}, "trace_event_set_t": {"id_type":"type", "header":"sys/types.h", "extensions":["OB","TEF"]}, "trace_id_t": {"id_type":"type", "header":"sys/types.h", "extensions":["OB","TRC"]}, + "TRACE_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":["OB", "TRC"]}, + "TRACE_SYS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":["OB", "TRC"]}, + "TRACE_USER_EVENT_MAX": {"id_type":"constant", "header":"limits.h", "extensions":["OB", "TRC"]}, + "TRAP_BRKPT": {"id_type":"constant", "header":"signal.h", "extensions":["XSI"]}, + "TRAP_TRACE": {"id_type":"constant", "header":"signal.h", "extensions":["XSI"]}, "true": {"id_type":"macro", "header":"stdbool.h", "extensions":[]}, "trunc": {"id_type":"function", "header":"math.h", "extensions":[]}, "truncate": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "truncf": {"id_type":"function", "header":"math.h", "extensions":[]}, "truncl": {"id_type":"function", "header":"math.h", "extensions":[]}, + "TRY_AGAIN": {"id_type":"macro", "header":"netdb.h", "extensions":["REM"]}, "tsearch": {"id_type":"function", "header":"search.h", "extensions":[]}, + "TSGID": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "TSUID": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "TSVTX": {"id_type":"constant", "header":"tar.h", "extensions":["XSI"]}, + "TTY_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, "ttyname": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "ttyname_r": {"id_type":"function", "header":"unistd.h", "extensions":[]}, + "ttyslot": {"id_type":"function", "header":"stdlib.h", "extensions":["REM"]}, + "TUEXEC": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "TUREAD": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "TUWRITE": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "tv_nsec": {"id_type":"field", "header":"time.h", "extensions":[]}, + "tv_sec": {"id_type":"field", "header":"time.h", "extensions":[]}, + "tv_usec": {"id_type":"field", "header":"sys/time.h", "extensions":[]}, + "TVERSION": {"id_type":"constant", "header":"tar.h", "extensions":[]}, + "TVERSLEN": {"id_type":"constant", "header":"tar.h", "extensions":[]}, "twalk": {"id_type":"function", "header":"search.h", "extensions":[]}, - "tzname": {"id_type":"variable", "header":"time.h", "extensions":["IP6"]}, - "tzset": {"id_type":"function", "header":"time.h", "extensions":["IP6"]}, + "tzname": {"id_type":"variable", "header":"time.h", "extensions":[]}, + "TZNAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]}, + "tzset": {"id_type":"function", "header":"time.h", "extensions":[]}, + "uc_link": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "uc_mcontext": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "uc_sigmask": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, + "uc_stack": {"id_type":"field", "header":"signal.h", "extensions":["CX"]}, "UCHAR_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]}, "ucontext_t": {"id_type":"type", "header":"signal.h", "extensions":[]}, + "uid": {"id_type":"field", "header":"stropts.h", "extensions":[]}, "uid_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]}, + "UINT16_C": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "UINT16_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uint16_t": {"id_type":"type", "header":"stdint.h", "extensions":["CX"]}, + "UINT32_C": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "UINT32_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uint32_t": {"id_type":"type", "header":"stdint.h", "extensions":["CX"]}, + "UINT64_C": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "UINT64_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uint64_t": {"id_type":"type", "header":"stdint.h", "extensions":["CX"]}, + "UINT8_C": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "UINT8_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uint8_t": {"id_type":"type", "header":"stdint.h", "extensions":["CX"]}, + "UINT_FAST16_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uint_fast16_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "UINT_FAST32_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uint_fast32_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "UINT_FAST64_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uint_fast64_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "UINT_FAST8_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uint_fast8_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "UINT_LEAST16_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uint_least16_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "UINT_LEAST32_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uint_least32_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "UINT_LEAST64_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uint_least64_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "UINT_LEAST8_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uint_least8_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, "UINT_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]}, + "UINTMAX_C": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "UINTMAX_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uintmax_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "UINTPTR_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "uintptr_t": {"id_type":"type", "header":"stdint.h", "extensions":[]}, + "UIO_MAXIOV": {"id_type":"constant", "header":"sys/uio.h", "extensions":["REM"]}, + "UL_GETFSIZE": {"id_type":"constant", "header":"ulimit.h", "extensions":[]}, + "UL_SETFSIZE": {"id_type":"constant", "header":"ulimit.h", "extensions":[]}, "ulimit": {"id_type":"function", "header":"ulimit.h", "extensions":[]}, "ULLONG_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]}, "ULONG_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]}, @@ -2009,37 +3420,70 @@ "unlinkat": {"id_type":"function", "header":"unistd.h", "extensions":[]}, "unlockpt": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]}, "unsetenv": {"id_type":"function", "header":"stdlib.h", "extensions":["CX"]}, + "useconds_t": {"id_type":"type", "header":"unistd.h", "extensions":["XSI"]}, + "uselocale": {"id_type":"function", "header":"locale.h", "extensions":["CX"]}, "USER_PROCESS": {"id_type":"constant", "header":"utmpx.h", "extensions":[]}, "USHRT_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]}, "usleep": {"id_type":"function", "header":"unistd.h", "extensions":["OB","REM"]}, + "ut_id": {"id_type":"field", "header":"utmpx.h", "extensions":[]}, + "ut_line": {"id_type":"field", "header":"utmpx.h", "extensions":[]}, + "ut_pid": {"id_type":"field", "header":"utmpx.h", "extensions":[]}, + "ut_tv": {"id_type":"field", "header":"utmpx.h", "extensions":[]}, + "ut_type": {"id_type":"field", "header":"utmpx.h", "extensions":[]}, + "ut_user": {"id_type":"field", "header":"utmpx.h", "extensions":[]}, "utimbuf": {"id_type":"type", "header":"utime.h", "extensions":[]}, "utime": {"id_type":"function", "header":"utime.h", "extensions":[]}, + "UTIME_NOW": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, + "UTIME_OMIT": {"id_type":"constant", "header":"sys/stat.h", "extensions":[]}, "utimensat": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]}, - "utimes": {"id_type":"function", "header":"sys/time.h", "extensions":["IP6"]}, + "utimes": {"id_type":"function", "header":"sys/time.h", "extensions":[]}, "utmpx": {"id_type":"type", "header":"utmpx.h", "extensions":[]}, "utsname": {"id_type":"type", "header":"sys/utsname.h", "extensions":[]}, - "va_arg": {"id_type":"type", "header":"stdarg.h", "extensions":[]}, + "va_arg": {"id_type":"macro", "header":"stdarg.h", "extensions":[]}, "va_copy": {"id_type":"macro", "header":"stdarg.h", "extensions":[]}, "va_end": {"id_type":"macro", "header":"stdarg.h", "extensions":[]}, "va_list": {"id_type":"type", "header":"stdarg.h", "extensions":[]}, "va_start": {"id_type":"macro", "header":"stdarg.h", "extensions":[]}, + "valloc": {"id_type":"function", "header":"stdlib.h", "extensions":["REM"]}, + "VDISCARD": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, "vdprintf": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]}, + "VDSUSP": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, + "VEOF": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "VEOL": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "VERASE": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "version": {"id_type":"field", "header":"sys/utsname.h", "extensions":[]}, "vfprintf": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "vfscanf": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "vfwprintf": {"id_type":"function", "header":"wchar.h", "extensions":[]}, "vfwscanf": {"id_type":"function", "header":"wchar.h", "extensions":[]}, + "VINTR": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "VISIT": {"id_type":"type", "header":"search.h", "extensions":[]}, + "VKILL": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "VLNEXT": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, + "VMIN": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "vprintf": {"id_type":"function", "header":"stdio.h", "extensions":[]}, + "VQUIT": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "VREPRINT": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, "vscanf": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "vsnprintf": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "vsprintf": {"id_type":"function", "header":"stdio.h", "extensions":[]}, "vsscanf": {"id_type":"function", "header":"stdio.h", "extensions":[]}, + "VSTART": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "VSTATUS": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, + "VSTOP": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "VSUSP": {"id_type":"constant", "header":"termios.h", "extensions":[]}, "vswprintf": {"id_type":"function", "header":"wchar.h", "extensions":[]}, "vswscanf": {"id_type":"function", "header":"wchar.h", "extensions":[]}, + "VT0": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, + "VT1": {"id_type":"constant", "header":"termios.h", "extensions":["XSI"]}, "VTDLY": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "VTIME": {"id_type":"constant", "header":"termios.h", "extensions":[]}, + "VWERASE": {"id_type":"reserved_name", "header":"termios.h", "extensions":["XSI"]}, "vwprintf": {"id_type":"function", "header":"wchar.h", "extensions":[]}, "vwscanf": {"id_type":"function", "header":"wchar.h", "extensions":[]}, "W_OK": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, "wait": {"id_type":"function", "header":"sys/wait.h", "extensions":[]}, + "wait3": {"id_type":"function", "header":"sys/wait.h", "extensions":["REM"]}, "waitid": {"id_type":"function", "header":"sys/wait.h", "extensions":[]}, "waitpid": {"id_type":"function", "header":"sys/wait.h", "extensions":[]}, "WCHAR_MAX": {"id_type":"macro", "header":"wchar.h", "extensions":[]}, @@ -2096,6 +3540,9 @@ "wctype_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]}, "wctype_t": {"id_type":"type", "header":"wchar.h", "extensions":["OB","XSI"]}, "wcwidth": {"id_type":"function", "header":"wchar.h", "extensions":["XSI"]}, + "we_offs": {"id_type":"field", "header":"wordexp.h", "extensions":[]}, + "we_wordc": {"id_type":"field", "header":"wordexp.h", "extensions":[]}, + "we_wordv": {"id_type":"field", "header":"wordexp.h", "extensions":[]}, "WEOF": {"id_type":"macro", "header":"wchar.h", "extensions":[]}, "WEXITED": {"id_type":"constant", "header":"sys/wait.h", "extensions":[]}, "WEXITSTATUS": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]}, @@ -2103,6 +3550,8 @@ "WIFEXITED": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]}, "WIFSIGNALED": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]}, "WIFSTOPPED": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]}, + "WINT_MAX": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, + "WINT_MIN": {"id_type":"macro", "header":"stdint.h", "extensions":[]}, "wint_t": {"id_type":"type", "header":"wchar.h", "extensions":["OB","XSI"]}, "wmemchr": {"id_type":"function", "header":"wchar.h", "extensions":[]}, "wmemcmp": {"id_type":"function", "header":"wchar.h", "extensions":[]}, @@ -2123,6 +3572,7 @@ "WRDE_DOOFFS": {"id_type":"constant", "header":"wordexp.h", "extensions":[]}, "WRDE_NOCMD": {"id_type":"constant", "header":"wordexp.h", "extensions":[]}, "WRDE_NOSPACE": {"id_type":"constant", "header":"wordexp.h", "extensions":[]}, + "WRDE_NOSYS": {"id_type":"constant", "header":"wordexp.h", "extensions":["REM"]}, "WRDE_REUSE": {"id_type":"constant", "header":"wordexp.h", "extensions":[]}, "WRDE_SHOWERR": {"id_type":"constant", "header":"wordexp.h", "extensions":[]}, "WRDE_SYNTAX": {"id_type":"constant", "header":"wordexp.h", "extensions":[]}, @@ -2135,10 +3585,13 @@ "WTERMSIG": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]}, "WUNTRACED": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]}, "X_OK": {"id_type":"constant", "header":"unistd.h", "extensions":[]}, + "XCASE": {"id_type":"constant", "header":"termios.h", "extensions":["REM"]}, "xor": {"id_type":"macro", "header":"iso646.h", "extensions":[]}, "xor_eq": {"id_type":"macro", "header":"iso646.h", "extensions":[]}, "y0": {"id_type":"function", "header":"math.h", "extensions":["XSI"]}, "y1": {"id_type":"function", "header":"math.h", "extensions":["XSI"]}, + "YESEXPR": {"id_type":"constant", "header":"langinfo.h", "extensions":[]}, + "YESSTR": {"id_type":"constant", "header":"langinfo.h", "extensions":["REM"]}, "yn": {"id_type":"function", "header":"math.h", "extensions":["XSI"]} } } diff --git a/share/libc/__fc_define_locale_t.h b/share/libc/__fc_define_locale_t.h new file mode 100644 index 0000000000000000000000000000000000000000..68e4db7e6d583669e556700dc00748434bfa9b44 --- /dev/null +++ b/share/libc/__fc_define_locale_t.h @@ -0,0 +1,36 @@ +/**************************************************************************/ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/**************************************************************************/ + +#ifndef __FC_DEFINE_LOCALE_T +#define __FC_DEFINE_LOCALE_T +#include "features.h" +__PUSH_FC_STDLIB +__BEGIN_DECLS +struct __fc_locale_struct +{ + const char *names[13]; +}; + +typedef struct __fc_locale_struct *locale_t; +__END_DECLS +__POP_FC_STDLIB +#endif diff --git a/share/libc/__fc_gcc_builtins.h b/share/libc/__fc_gcc_builtins.h index 875f746cc4d71193055c581c0054ece30d86c456..6fb694b3dba48b4fc1d13026f43203d437816c60 100644 --- a/share/libc/__fc_gcc_builtins.h +++ b/share/libc/__fc_gcc_builtins.h @@ -254,6 +254,13 @@ int __builtin_popcountl (unsigned long x); */ int __builtin_popcountll (unsigned long long x); +// According to the GCC docs +// (https://gcc.gnu.org/onlinedocs/gcc/_005f_005fsync-Builtins.html), +// this creates a 'full memory barrier'; we do not model the concurrency +// aspects yet. +/*@ assigns \nothing; */ +void __sync_synchronize(void); + __END_DECLS __POP_FC_STDLIB diff --git a/share/libc/__fc_libc.h b/share/libc/__fc_libc.h index 310a2148445201ee81609116a1a60c4c84d617b0..2f78bbc8bb1d848eeccbe2192d7343b117bee043 100644 --- a/share/libc/__fc_libc.h +++ b/share/libc/__fc_libc.h @@ -51,6 +51,7 @@ #include "ifaddrs.h" #include "inttypes.h" #include "iso646.h" +#include "langinfo.h" #include "libgen.h" #include "limits.h" #include "locale.h" @@ -79,6 +80,7 @@ #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "stdnoreturn.h" #include "string.h" #include "strings.h" #include "stropts.h" diff --git a/share/libc/fcntl.h b/share/libc/fcntl.h index 2fb91da8e750e37edddf13263dd6e283dc221be7..7ef658186f97dd26eb9503d0337d8af367f6e357 100644 --- a/share/libc/fcntl.h +++ b/share/libc/fcntl.h @@ -63,6 +63,9 @@ __PUSH_FC_STDLIB #define O_TRUNC 0x200 //#define O_TTY_INIT +// Non-POSIX +#define O_DIRECT 0x4000 + #define O_APPEND 0x400 #define O_DSYNC 0x1000 #define O_NONBLOCK 0x800 diff --git a/share/libc/langinfo.h b/share/libc/langinfo.h new file mode 100644 index 0000000000000000000000000000000000000000..02ba80f8dd4e0db7938da86282f9079fac468324 --- /dev/null +++ b/share/libc/langinfo.h @@ -0,0 +1,163 @@ +/**************************************************************************/ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/**************************************************************************/ + +#ifndef __FC_LANGINFO_H +#define __FC_LANGINFO_H +#include "features.h" +__PUSH_FC_STDLIB +#include "__fc_define_locale_t.h" +#include "nl_types.h" +#include "locale.h" // for LC_CTYPE and other constants +__BEGIN_DECLS + + +#define _NL_ITEM(category, index) (((category) << 16) | (index)) + +/* Extract the category and item index from a constructed `nl_item' value. */ +#define _NL_ITEM_CATEGORY(item) ((int) (item) >> 16) +#define _NL_ITEM_INDEX(item) ((int) (item) & 0xffff) + +enum +{ + CODESET = (LC_CTYPE) << 16, +#define CODESET CODESET + ABDAY_1 = (LC_TIME) << 16, +#define ABDAY_1 ABDAY_1 + ABDAY_2, +#define ABDAY_2 ABDAY_2 + ABDAY_3, +#define ABDAY_3 ABDAY_3 + ABDAY_4, +#define ABDAY_4 ABDAY_4 + ABDAY_5, +#define ABDAY_5 ABDAY_5 + ABDAY_6, +#define ABDAY_6 ABDAY_6 + ABDAY_7, +#define ABDAY_7 ABDAY_7 + DAY_1, +#define DAY_1 DAY_1 + DAY_2, +#define DAY_2 DAY_2 + DAY_3, +#define DAY_3 DAY_3 + DAY_4, +#define DAY_4 DAY_4 + DAY_5, +#define DAY_5 DAY_5 + DAY_6, +#define DAY_6 DAY_6 + DAY_7, +#define DAY_7 DAY_7 + ABMON_1, +#define ABMON_1 ABMON_1 + ABMON_2, +#define ABMON_2 ABMON_2 + ABMON_3, +#define ABMON_3 ABMON_3 + ABMON_4, +#define ABMON_4 ABMON_4 + ABMON_5, +#define ABMON_5 ABMON_5 + ABMON_6, +#define ABMON_6 ABMON_6 + ABMON_7, +#define ABMON_7 ABMON_7 + ABMON_8, +#define ABMON_8 ABMON_8 + ABMON_9, +#define ABMON_9 ABMON_9 + ABMON_10, +#define ABMON_10 ABMON_10 + ABMON_11, +#define ABMON_11 ABMON_11 + ABMON_12, +#define ABMON_12 ABMON_12 + MON_1, +#define MON_1 MON_1 + MON_2, +#define MON_2 MON_2 + MON_3, +#define MON_3 MON_3 + MON_4, +#define MON_4 MON_4 + MON_5, +#define MON_5 MON_5 + MON_6, +#define MON_6 MON_6 + MON_7, +#define MON_7 MON_7 + MON_8, +#define MON_8 MON_8 + MON_9, +#define MON_9 MON_9 + MON_10, +#define MON_10 MON_10 + MON_11, +#define MON_11 MON_11 + MON_12, +#define MON_12 MON_12 + AM_STR, +#define AM_STR AM_STR + PM_STR, +#define PM_STR PM_STR + D_T_FMT, +#define D_T_FMT D_T_FMT + D_FMT, +#define D_FMT D_FMT + T_FMT, +#define T_FMT T_FMT + T_FMT_AMPM, +#define T_FMT_AMPM T_FMT_AMPM + ERA, +#define ERA ERA + ERA_YEAR, // Non-POSIX; GNU +#define ERA_YEAR ERA_YEAR + ERA_D_FMT, +#define ERA_D_FMT ERA_D_FMT + ALT_DIGITS, +#define ALT_DIGITS ALT_DIGITS + ERA_D_T_FMT, +#define ERA_D_T_FMT ERA_D_T_FMT + ERA_T_FMT, +#define ERA_T_FMT ERA_T_FMT + DECIMAL_POINT = (LC_NUMERIC) << 16, // Non-POSIX; GNU +#define DECIMAL_POINT DECIMAL_POINT + RADIXCHAR, +#define RADIXCHAR RADIXCHAR + THOUSEP, +#define THOUSEP THOUSEP + YESEXPR = (LC_MESSAGES) << 16, +#define YESEXPR YESEXPR + NOEXPR, +#define NOEXPR NOEXPR + CRNCYSTR = (LC_MONETARY) << 16, +#define CRNCYSTR CRNCYSTR +}; + +extern char *nl_langinfo(nl_item item); +extern char *nl_langinfo_l(nl_item item, locale_t locale); + +__END_DECLS + +__POP_FC_STDLIB +#endif diff --git a/share/libc/locale.h b/share/libc/locale.h index ca23603228d31d79d2a1b3d2f2870df595cb9eb6..04b0e75495cd42e1db3f8f966a56a97f22afbede 100644 --- a/share/libc/locale.h +++ b/share/libc/locale.h @@ -24,7 +24,7 @@ #define __FC_LOCALE #include "features.h" __PUSH_FC_STDLIB - +#include "__fc_define_locale_t.h" __BEGIN_DECLS /* Structure giving information about numeric and monetary notation. */ @@ -149,6 +149,11 @@ extern char *setlocale(int category, const char *locale); */ extern struct lconv *localeconv(void); +extern locale_t duplocale(locale_t); +extern void freelocale(locale_t); +extern locale_t newlocale(int, const char *, locale_t); +extern locale_t uselocale(locale_t); + __END_DECLS __POP_FC_STDLIB diff --git a/share/libc/regex.h b/share/libc/regex.h index c2bdf2b425113a938daa1de1d651b9641e966483..a08abdb485d329cf89f52d46e97939d2565e1e74 100644 --- a/share/libc/regex.h +++ b/share/libc/regex.h @@ -25,10 +25,16 @@ #include "features.h" __PUSH_FC_STDLIB #include "__fc_define_size_t.h" - +#include "__fc_define_ssize_t.h" __BEGIN_DECLS -struct re_pattern_buffer { size_t re_nsub; }; +struct re_pattern_buffer { + struct re_dfa_t *buffer; // Non-POSIX + size_t allocated; // Non-POSIX + char *fastmap; // Non-POSIX + unsigned char *translate; // Non-POSIX + size_t re_nsub; +}; typedef struct re_pattern_buffer regex_t; @@ -64,7 +70,15 @@ typedef enum __fc_reg_errcode_t REG_ERPAREN } reg_errcode_t; -typedef int regoff_t; +typedef ssize_t regoff_t; + +// Non-POSIX +struct re_registers +{ + size_t num_regs; + regoff_t *start; + regoff_t *end; +}; typedef struct __fc_regmatch_t { diff --git a/share/libc/stdlib.c b/share/libc/stdlib.c index e473fe89afb026b9a81774ef8121ac3ef6f43d3d..1596d1b195cb31ca7ad38fe24776998ea7c1034b 100644 --- a/share/libc/stdlib.c +++ b/share/libc/stdlib.c @@ -232,4 +232,9 @@ char *realpath(const char *restrict file_name, char *restrict resolved_name) return resolved_name; } +char *canonicalize_file_name(const char *path) { + return realpath(path, NULL); +} + + __POP_FC_STDLIB diff --git a/share/libc/stdlib.h b/share/libc/stdlib.h index 688c2885483ab84cac47bdaae2a7ad9d8582bb08..c40adfa3b82f785d4e47384e8bf387c69e61daa5 100644 --- a/share/libc/stdlib.h +++ b/share/libc/stdlib.h @@ -692,6 +692,7 @@ extern int posix_memalign(void **memptr, size_t alignment, size_t size); // missing: requires 'last 6 characters of template must be XXXXXX' // missing: assigns \result, templat[0..] \from 'filesystem', 'RNG'; requires valid_template: valid_string(templat); + requires template_len: strlen(templat) >= 6; assigns templat[0..] \from \nothing; assigns \result \from \nothing; ensures result_error_or_valid_fd: \result == -1 || @@ -699,9 +700,31 @@ extern int posix_memalign(void **memptr, size_t alignment, size_t size); */ extern int mkstemp(char *templat); +/*@ + // missing: requires 'last (6+suffixlen) characters of template must be X's' + // missing: assigns \result, templat[0..] \from 'filesystem', 'RNG'; + requires valid_template: valid_string(templat); + requires template_len: strlen(templat) >= 6 + suffixlen; + requires non_negative_suffixlen: suffixlen >= 0; + assigns templat[0..] \from \nothing; + assigns \result \from \nothing; + ensures result_error_or_valid_fd: \result == -1 || + 0 <= \result < __FC_FOPEN_MAX; + */ +extern int mkstemps(char *templat, int suffixlen); + +// This function may allocate memory for the result, which is not supported by +// some plugins such as Eva. In such cases, it is preferable to use the stub +// provided in stdlib.c. extern char *realpath(const char *restrict file_name, char *restrict resolved_name); +// Non-POSIX; GNU extension +// This function may allocate memory for the result, which is not supported by +// some plugins such as Eva. In such cases, it is preferable to use the stub +// provided in stdlib.c. +extern char *canonicalize_file_name(const char *path); + __END_DECLS __POP_FC_STDLIB diff --git a/share/libc/stdnoreturn.h b/share/libc/stdnoreturn.h new file mode 100644 index 0000000000000000000000000000000000000000..866c6b74aea1524771ba6b19928699fa832f8dbb --- /dev/null +++ b/share/libc/stdnoreturn.h @@ -0,0 +1,31 @@ +/**************************************************************************/ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/**************************************************************************/ + +// This file is not in the C standard; it exists for compatibility purposes + +// 'noreturn' is an attribute in C++ +#ifndef __cpluscplus +// Note that Frama-C still requires the '-c11' command-line option to parse +// the _Noreturn keyword. Mere inclusion of this header without the option +// will not work. +#define noreturn _Noreturn +#endif diff --git a/share/libc/sys/stat.h b/share/libc/sys/stat.h index 190c944be8249e58ea6a2fd5d15f9e330fc04f0c..b2deabaa9cae10a03be9003e0c3fb8aff4c61f48 100644 --- a/share/libc/sys/stat.h +++ b/share/libc/sys/stat.h @@ -104,6 +104,21 @@ extern mode_t umask(mode_t cmask); #define S_TYPEISSHM(buf) ((buf)->st_mode - (buf)->st_mode) #define S_TYPEISTMO(buf) (0) +// Non-POSIX; Linux-specific +#define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO) +#define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO) +#define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH) +#define S_IWUGO (S_IWUSR|S_IWGRP|S_IWOTH) +#define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH) + +// Non-POSIX +#define S_IFDOOR 0 +#define S_ISDOOR(m) 0 + +// Non-POSIX +#define UTIME_NOW ((1L << 30) - 1L) +#define UTIME_OMIT ((1L << 30) - 2L) + __END_DECLS __POP_FC_STDLIB #endif diff --git a/share/libc/sys/types.h b/share/libc/sys/types.h index d540a3b9df7a7469f367a4bc69585a872a7546ab..929f09a019cc2393b6dd29a6ea34f1c27f2c80d1 100644 --- a/share/libc/sys/types.h +++ b/share/libc/sys/types.h @@ -50,10 +50,12 @@ typedef unsigned int u_int; typedef unsigned short u_short; typedef unsigned char u_char; -// Note: makedev (non-POSIX) is usually a macro; in case of problems, -// consider redefining this. -/*@ assigns \result \from maj, min; */ -extern dev_t makedev(int maj, int min); +// The macros below are non-POSIX; the definitions below should allow +// parsing coreutils. +# define major(dev) (((dev) >> 8) & 0xff) +# define minor(dev) ((dev) & 0xff) +# define makedev(maj, min) (((maj) << 8) | (min)) + #define __u_char_defined #endif diff --git a/share/libc/sys/wait.h b/share/libc/sys/wait.h index df14c934bc7579ada01667cb475a3f86acc24111..37ea46dc9ec1e4dbafeeded333052ba499c3677b 100644 --- a/share/libc/sys/wait.h +++ b/share/libc/sys/wait.h @@ -45,6 +45,9 @@ __BEGIN_DECLS #define WNOWAIT 0x01000000 #define WSTOPPED 2 +// Non-POSIX +#define WCOREDUMP(status) ((status) & 0x80) + #include "../__fc_define_id_t.h" #include "../__fc_define_pid_t.h" #include "../__fc_define_uid_and_gid.h" diff --git a/share/libc/time.h b/share/libc/time.h index fe6304ce88d58490ddb41494e6608c6ffed332b0..1ac6af43c3f62aad9dd09505ba54b12079a3de55 100644 --- a/share/libc/time.h +++ b/share/libc/time.h @@ -148,6 +148,7 @@ extern struct tm *gmtime(const time_t *timer); assigns __fc_time_tm \from *timer; ensures result_null_or_internal_tm: \result == &__fc_time_tm || \result == \null; + ensures maybe_error: errno == \old(errno) || errno == EOVERFLOW; */ extern struct tm *localtime(const time_t *timer); @@ -277,6 +278,16 @@ extern struct tm *getdate(const char *string); extern struct tm *gmtime_r(const time_t *restrict timer, struct tm *restrict result); +/*@ + requires valid_timer: \valid_read(timep); + requires valid_result: \valid(result); + assigns \result \from indirect:*timep, result; + assigns *result \from indirect:*timep; + assigns errno \from indirect:*timep; + ensures result_null_or_initialized:initialization: + (\result == result && \initialized(result)) || \result == \null; + ensures maybe_error: errno == \old(errno) || errno == EOVERFLOW; +*/ extern struct tm *localtime_r(const time_t *restrict timep, struct tm *restrict result); diff --git a/src/kernel_internals/typing/cabs2cil.ml b/src/kernel_internals/typing/cabs2cil.ml index 06d74aa1d67bc6ffca2692da322921dea0aa1d41..f6aebe306d45681b089a7e5e8c08a75260f7e139 100644 --- a/src/kernel_internals/typing/cabs2cil.ml +++ b/src/kernel_internals/typing/cabs2cil.ml @@ -208,7 +208,7 @@ let rec is_dangerous_offset = function let rec is_dangerous e = match e.enode with | Lval lv | AddrOf lv | StartOf lv -> is_dangerous_lval lv - | UnOp (_,e,_) | CastE(_,e) | Info(e,_) -> is_dangerous e + | UnOp (_,e,_) | CastE(_,e) -> is_dangerous e | BinOp(_,e1,e2,_) -> is_dangerous e1 || is_dangerous e2 | Const _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ -> false @@ -1379,12 +1379,12 @@ let rec is_boolean_result e = | None -> false) | CastE (_,e) -> is_boolean_result e | BinOp((Lt | Gt | Le | Ge | Eq | Ne | LAnd | LOr),_,_,_) -> true - | BinOp((PlusA | PlusPI | IndexPI | MinusA | MinusPI | MinusPP | Mult + | BinOp((PlusA | PlusPI | MinusA | MinusPI | MinusPP | Mult | Div | Mod | Shiftlt | Shiftrt | BAnd | BXor | BOr),_,_,_) -> false | UnOp(LNot,_,_) -> true | UnOp ((Neg | BNot),_,_) -> false | Lval _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ - | AlignOfE _ | AddrOf _ | StartOf _ | Info _ -> false + | AlignOfE _ | AddrOf _ | StartOf _ -> false (* Like Cil.mkCastT, but it calls typeForInsertedCast *) let makeCastT ~(e: exp) ~(oldt: typ) ~(newt: typ) = @@ -3384,7 +3384,13 @@ let rec setOneInit this o preinit = let pMaxIdx, pArray = match this with | NoInitPre -> (* No initializer so far here *) - ref idx, ref (Array.make (max 32 (idx + 1)) NoInitPre) + begin + try + ref idx, ref (Array.make (max 32 (idx + 1)) NoInitPre) + with Invalid_argument _ | Out_of_memory -> + Kernel.abort ~current:true + "array length too large: %d" ((max 32 (idx + 1))) + end | CompoundPre (pMaxIdx, pArray) -> if !pMaxIdx < idx then begin @@ -3763,11 +3769,11 @@ let integerArrayLength (leno: exp option) : int = | None -> max_int | Some len -> try lenOfArray leno - with LenOfArray -> - Kernel.fatal ~current:true - "Array length %a is not a compile-time constant: \ - no explicit initializer allowed." - Cil_printer.pp_exp len + with + | LenOfArray cause -> + Kernel.abort ~current:true + "Array length %a is %a: no explicit initializer allowed." + Cil_printer.pp_exp len Cil.pp_incorrect_array_length cause let find_field_offset cond (fidlist: fieldinfo list) : offset = (* Depth first search for the field. This appears to be what GCC does. @@ -4014,7 +4020,8 @@ struct Pretty_utils.ksfprintf (fun e -> raise (LogicTypeError (loc,e))) msg let on_error f rollback x = - try f x with LogicTypeError _ as exn -> rollback(); raise exn + try f x with + | LogicTypeError (loc,e) as exn -> rollback (loc,e); raise exn end @@ -5496,24 +5503,21 @@ and makeCompType ghost (isstruct: bool) match widtho with | None -> None, ftype | Some w -> begin + let source = fst w.expr_loc in (match unrollType ftype with | TInt (_, _) -> () | TEnum _ -> () | _ -> - Kernel.error ~once:true ~source + Kernel.abort ~once:true ~source "Base type for bitfield is not an integer type"); match isIntegerConstant ghost w with | None -> - Kernel.error ~source + Kernel.abort ~source "bitfield width is not a valid integer constant"; - (* error does not immediately stop execution. - Hence, we return a placeholder here. - *) - Some 0, ftype | Some s as w -> begin if s < 0 then - Kernel.error ~source "negative bitfield width (%d)" s; + Kernel.abort ~source "negative bitfield width (%d)" s; try if s > Cil.bitsSizeOf ftype then Kernel.error ~source @@ -5552,8 +5556,12 @@ and makeCompType ghost (isstruct: bool) anonCompFieldName ^ (string_of_int !anonCompFieldNameId) end | _ -> n - end else + end else begin + if fbitfield = Some 0 then + Kernel.error ~source:(fst cloc) + "named bitfield (%s) with zero width" n; n + end in let rec is_circular t = match Cil.unrollType t with @@ -5913,7 +5921,7 @@ and doExp local_env addOffsetLval (Index(e2'', NoOffset)) array | _ -> (* Turn into *(e1 + e2) *) mkMem - (new_exp ~loc:e1''.eloc (BinOp(IndexPI, e1'', e2'', t1))) + (new_exp ~loc:e1''.eloc (BinOp(PlusPI, e1'', e2'', t1))) NoOffset in (* Do some optimization of StartOf *) diff --git a/src/kernel_internals/typing/rmtmps.ml b/src/kernel_internals/typing/rmtmps.ml index 8103797ff666d3534f82087cc37e2ea9e60bb995..0bef4ca0188388bd11ccd2315ad6a9c9d4bfb3f3 100644 --- a/src/kernel_internals/typing/rmtmps.ml +++ b/src/kernel_internals/typing/rmtmps.ml @@ -790,8 +790,6 @@ let remove_unused_labels ?(is_removable=label_removable) func = (visitCilBlock (new removeUnusedLabels is_removable usedLabels) func.sbody) let removeUnmarked isRoot ast reachable_tbl = - let removedLocals = ref [] in - let filterGlobal global = match global with (* unused global types, variables, and functions are simply removed *) @@ -823,11 +821,7 @@ let removeUnmarked isRoot ast reachable_tbl = if (local.vtemp || local.vstorage = Static) && not (is_reachable reachable_tbl (Var local)) then begin - (* along the way, record the interesting locals that were removed *) - let name = local.vname in - (Kernel.debug ~dkey "removing local: %s" name); - removedLocals := - (func.svar.vname ^ "::" ^ name) :: !removedLocals; + Kernel.debug ~dkey "removing local: %s" local.vname; false end else true in @@ -873,8 +867,7 @@ let removeUnmarked isRoot ast reachable_tbl = end; Kernel.debug ~dkey "kept global %s (%a)" (global_type_and_name rg) Printer.pp_global rg ) keptGlobals; - end; - !removedLocals + end (*********************************************************************** @@ -914,7 +907,7 @@ let removeUnused ?(isRoot=isExportedRoot) ast = markReferenced ast; (* take out the trash *) - ignore (removeUnmarked isRoot ast reachable_tbl) + removeUnmarked isRoot ast reachable_tbl end (* diff --git a/src/kernel_services/analysis/bit_utils.ml b/src/kernel_services/analysis/bit_utils.ml index 779bf41c4668613aca904c989869c9f84de04235..fd7780682e92a364e79922d1b1288d2eeaa3c56a 100644 --- a/src/kernel_services/analysis/bit_utils.ml +++ b/src/kernel_services/analysis/bit_utils.ml @@ -471,7 +471,7 @@ let rec type_compatible t1 t2 = | TArray (t1', s1, _), TArray (t2', s2, _) -> type_compatible t1' t2' && (s1 == s2 || try Integer.equal (Cil.lenOfArray64 s1) (Cil.lenOfArray64 s2) - with Cil.LenOfArray -> false) + with Cil.LenOfArray _ -> false) | TFun (r1, a1, v1, _), TFun (r2, a2, v2, _) -> v1 = v2 && type_compatible r1 r2 && (match a1, a2 with diff --git a/src/kernel_services/analysis/logic_interp.ml b/src/kernel_services/analysis/logic_interp.ml index d5811d7526f997ac28515309340640eeca135cc2..8bc42ae19f772560872dc9f1b2e963c8ba1c8ecd 100644 --- a/src/kernel_services/analysis/logic_interp.ml +++ b/src/kernel_services/analysis/logic_interp.ml @@ -130,7 +130,7 @@ module DefaultLT (X: Pretty_utils.ksfprintf (fun e -> raise (Error (loc, e))) msg let on_error f rollback x = - try f x with Error _ as exn -> rollback (); raise exn + try f x with Error (loc,msg) as exn -> rollback (loc,msg); raise exn end) diff --git a/src/kernel_services/ast_building/cil_builder.ml b/src/kernel_services/ast_building/cil_builder.ml index b2767a1a9e131934f3e15fb13b508496e8715180..75b1683898f297a5fd421c9c038acb77ffcf566d 100644 --- a/src/kernel_services/ast_building/cil_builder.ml +++ b/src/kernel_services/ast_building/cil_builder.ml @@ -745,7 +745,10 @@ struct | Skip -> Cil_types.Skip (loc) | Assign (dest,src) -> - Cil_types.Set (build_lval ~loc dest, build_exp ~loc src, loc) + let dest' = build_lval ~loc dest + and src' = build_exp ~loc src in + let src' = Cil.mkCast ~newt:(Cil.typeOfLval dest') src' in + Cil_types.Set (dest', src', loc) | Call (dest,callee,args) -> let dest' = Option.map (build_lval ~loc) dest and callee' = build_exp ~loc callee diff --git a/src/kernel_services/ast_data/annotations.ml b/src/kernel_services/ast_data/annotations.ml index 8869fe97088901d6ae11313b3bb9cb474203aec4..56739c79dd7706fde593cbef832fe22275d1d18c 100644 --- a/src/kernel_services/ast_data/annotations.ml +++ b/src/kernel_services/ast_data/annotations.ml @@ -365,14 +365,7 @@ let code_annot_emitter ?filter stmt = try let tbl = Code_annots.find stmt in let filter e l acc = - let e = - try Emitter.Usable_emitter.get e - with Not_found -> - (* in some cases, e.g. when loading a state with a different set - of plugins loaded, the original emitter might not be available, - leading to discarding annotations. Let the kernel adopt them. *) - Emitter.orphan - in + let e = Emitter.Usable_emitter.get e in match filter with | None -> List.map (fun a -> a, e) l @ acc | Some f -> diff --git a/src/kernel_services/ast_data/cil_types.ml b/src/kernel_services/ast_data/cil_types.ml index 1f798027f2b6803d8a9987ee8394323a902c3d14..8f13b954a39d7337a3a5e7eca15af4964316c234 100644 --- a/src/kernel_services/ast_data/cil_types.ml +++ b/src/kernel_services/ast_data/cil_types.ml @@ -698,15 +698,6 @@ and exp_node = [TPtr(T)]. In C this operation is implicit, the [StartOf] operator is not printed. We have it in CIL because it makes the typing rules simpler. *) - | Info of exp * exp_info - (** Additional information on the underlying expression *) - -(** Additional information on an expression *) -and exp_info = { - exp_type : logic_type; (** when used as placeholder for a term *) - exp_name: string list; -} - (* ************************************************************************* *) (** {2 Constants} *) (* ************************************************************************* *) @@ -759,12 +750,6 @@ and unop = and binop = PlusA (** arithmetic + *) | PlusPI (** pointer + integer *) - | IndexPI (** pointer + integer but only when it arises from an expression - [e\[i\]] when [e] is a pointer and - not an array. This is semantically - the same as PlusPI but CCured uses - this as a hint that the integer is - probably positive. *) | MinusA (** arithmetic - *) | MinusPI (** pointer - integer *) | MinusPP (** pointer - pointer *) diff --git a/src/kernel_services/ast_printing/cil_printer.ml b/src/kernel_services/ast_printing/cil_printer.ml index 041ad81546544c1a946bc4dae5fba040bdd471fd..4e2ba27dad635815b318f79d27b95b4b0b26f6d0 100644 --- a/src/kernel_services/ast_printing/cil_printer.ml +++ b/src/kernel_services/ast_printing/cil_printer.ml @@ -314,8 +314,7 @@ module Precedence = struct (assoc_connector_level thisLevel && thisLevel == contextprec && not state.print_cil_as_is)) - let getParenthLevel e = match (Cil.stripInfo e).enode with - | Info _ -> assert false + let getParenthLevel e = match e.enode with | BinOp(LAnd, _,_,_) -> and_level | BinOp(LOr, _,_,_) -> or_level (* Bit operations. *) @@ -325,7 +324,7 @@ module Precedence = struct (* Additive. Shifts can have higher level than + or - but I want parentheses around them *) | BinOp((MinusA|MinusPP|MinusPI|PlusA| - PlusPI|IndexPI|Shiftlt|Shiftrt),_,_,_) -> additiveLevel + PlusPI|Shiftlt|Shiftrt),_,_,_) -> additiveLevel (* Multiplicative *) | BinOp((Div|Mod|Mult),_,_,_) -> multiplicativeLevel (* Unary *) @@ -354,7 +353,7 @@ module Precedence = struct (* Additive. Shifts can have higher level than + or - but I want parentheses around them *) | TBinOp((MinusA|MinusPP|MinusPI|PlusA| - PlusPI|IndexPI|Shiftlt|Shiftrt),_,_) -> additiveLevel + PlusPI|Shiftlt|Shiftrt),_,_) -> additiveLevel (* Multiplicative *) | TBinOp((Div|Mod|Mult),_,_) -> multiplicativeLevel | Tapp({ l_var_info },[],[_;_]) @@ -797,8 +796,7 @@ class cil_printer () = object (self) parent_non_decay <- false; let level = Precedence.getParenthLevel e in (* fprintf fmt "/* eid:%d */" e.eid; *) - match (Cil.stripInfo e).enode with - | Info _ -> assert false + match e.enode with | Const(c) -> self#constant fmt c | Lval(l) -> self#lval fmt l @@ -854,7 +852,7 @@ class cil_printer () = object (self) method binop fmt b = fprintf fmt "%s" (match b with - | PlusA | PlusPI | IndexPI -> "+" + | PlusA | PlusPI -> "+" | MinusA | MinusPP | MinusPI -> "-" | Mult -> "*" | Div -> "/" @@ -1001,7 +999,7 @@ class cil_printer () = object (self) | Set(lv,e,_) -> begin (* Be nice to some special cases *) match e.enode with - BinOp((PlusA|PlusPI|IndexPI), + BinOp((PlusA|PlusPI), {enode = Lval(lv')}, {enode=Const(CInt64(one,_,_))},_) when LvalStructEq.equal lv lv' && Integer.equal one Integer.one @@ -1018,7 +1016,7 @@ class cil_printer () = object (self) (self#lval_prec Precedence.indexLevel) lv instr_terminator - | BinOp((PlusA|PlusPI|IndexPI), + | BinOp((PlusA|PlusPI), {enode = Lval(lv')}, {enode = Const(CInt64(mone,_,_))},_) when LvalStructEq.equal lv lv' && Integer.equal mone Integer.minus_one @@ -1027,7 +1025,7 @@ class cil_printer () = object (self) (self#lval_prec Precedence.indexLevel) lv instr_terminator - | BinOp((PlusA|PlusPI|IndexPI|MinusA|MinusPP|MinusPI|BAnd|BOr|BXor| + | BinOp((PlusA|PlusPI|MinusA|MinusPP|MinusPI|BAnd|BOr|BXor| Mult|Div|Mod|Shiftlt|Shiftrt) as bop, {enode = Lval(lv')},e,_) when LvalStructEq.equal lv lv' -> fprintf fmt "%a %a= %a%s" @@ -2419,7 +2417,7 @@ class cil_printer () = object (self) method term_binop fmt b = fprintf fmt "%s" (match b with - | PlusA | PlusPI | IndexPI -> "+" + | PlusA | PlusPI -> "+" | MinusA | MinusPP | MinusPI -> "-" | Mult -> "*" | Div -> "/" diff --git a/src/kernel_services/ast_printing/cil_types_debug.ml b/src/kernel_services/ast_printing/cil_types_debug.ml index f9c1724b21ea587c2532165f5f982ac4ec7f99a3..2ff6ad08971cd86179fd47ff9be974ea51fa852d 100644 --- a/src/kernel_services/ast_printing/cil_types_debug.ml +++ b/src/kernel_services/ast_printing/cil_types_debug.ml @@ -400,11 +400,6 @@ and pp_exp_node fmt = function | CastE(typ,exp) -> Format.fprintf fmt "CastE(%a,%a)" pp_typ typ pp_exp exp | AddrOf(lval) -> Format.fprintf fmt "AddrOf(%a)" pp_lval lval | StartOf(lval) -> Format.fprintf fmt "StartOf(%a)" pp_lval lval - | Info(exp,exp_info) -> Format.fprintf fmt "Info(%a,%a)" pp_exp exp pp_exp_info exp_info - -and pp_exp_info fmt exp_info = Format.fprintf fmt "{exp_type=%a;exp_name=%a}" - pp_logic_type exp_info.exp_type - (pp_list pp_string) exp_info.exp_name and pp_constant fmt = function | CInt64(integer,ikind,string_option) -> @@ -424,7 +419,6 @@ and pp_unop fmt = function and pp_binop fmt = function | PlusA -> Format.fprintf fmt "PlusA" | PlusPI -> Format.fprintf fmt "PlusPI" - | IndexPI -> Format.fprintf fmt "IndexPI" | MinusA -> Format.fprintf fmt "MinusA" | MinusPI -> Format.fprintf fmt "MinusPI" | MinusPP -> Format.fprintf fmt "MinusPP" diff --git a/src/kernel_services/ast_printing/cil_types_debug.mli b/src/kernel_services/ast_printing/cil_types_debug.mli index 1f9f96be7d91156fa8bd30165c5547cc98a4f271..a3354f6d42dfa38c5b969ac01d3662f1083a30e1 100644 --- a/src/kernel_services/ast_printing/cil_types_debug.mli +++ b/src/kernel_services/ast_printing/cil_types_debug.mli @@ -86,7 +86,6 @@ val pp_varinfo : Cil_types.varinfo Pretty_utils.formatter val pp_storage : Format.formatter -> Cil_types.storage -> unit val pp_exp : Cil_types.exp Pretty_utils.formatter val pp_exp_node : Format.formatter -> Cil_types.exp_node -> unit -val pp_exp_info : Format.formatter -> Cil_types.exp_info -> unit val pp_constant : Format.formatter -> Cil_types.constant -> unit val pp_unop : Format.formatter -> Cil_types.unop -> unit val pp_binop : Format.formatter -> Cil_types.binop -> unit diff --git a/src/kernel_services/ast_queries/acsl_extension.ml b/src/kernel_services/ast_queries/acsl_extension.ml index 7445dddc90a485832dd140ab261abfcbebba5f02..a567ed8ccca770cba8ff20fcccde8d48e0237e87 100644 --- a/src/kernel_services/ast_queries/acsl_extension.ml +++ b/src/kernel_services/ast_queries/acsl_extension.ml @@ -152,7 +152,7 @@ module Extensions = struct let status = ext_info.status in let typer = ext_info.typer in let normal_error = ref false in - let has_error () = normal_error := true in + let has_error _ = normal_error := true in let wrapper = typing_context.on_error (typer typing_context loc) has_error in @@ -168,7 +168,7 @@ module Extensions = struct let status = ext_info.status in let typer = ext_info.typer in let normal_error = ref false in - let has_error () = normal_error := true in + let has_error _ = normal_error := true in let wrapper = typing_context.on_error (typer typing_context loc) has_error in diff --git a/src/kernel_services/ast_queries/ast_info.ml b/src/kernel_services/ast_queries/ast_info.ml index bb5c62f1ed2417e8c9ffd44677f5b30fc9e476b9..f7c5ad5f38fae6fdb89487953fb486ae35e48ba0 100644 --- a/src/kernel_services/ast_queries/ast_info.ml +++ b/src/kernel_services/ast_queries/ast_info.ml @@ -39,7 +39,7 @@ let rec possible_value_of_integral_const = function | _ -> None and possible_value_of_integral_expr e = - match (stripInfo e).enode with + match e.enode with | Const c -> possible_value_of_integral_const c | _ -> None @@ -53,13 +53,13 @@ let value_of_integral_expr e = | None -> assert false | Some i -> i -let rec is_null_expr e = match (stripInfo e).enode with +let rec is_null_expr e = match e.enode with | Const c when is_integral_const c -> Integer.equal (value_of_integral_const c) Integer.zero | CastE(_,e) -> is_null_expr e | _ -> false -let rec is_non_null_expr e = match (stripInfo e).enode with +let rec is_non_null_expr e = match e.enode with | Const c when is_integral_const c -> not (Integer.equal (value_of_integral_const c) Integer.zero) | CastE(_,e) -> is_non_null_expr e diff --git a/src/kernel_services/ast_queries/cil.ml b/src/kernel_services/ast_queries/cil.ml index d58d7a5d50a5555e4721b04d3ce3d00464259054..9c05c0015985aee1aa74a6b4551f0105e99d86cf 100644 --- a/src/kernel_services/ast_queries/cil.ml +++ b/src/kernel_services/ast_queries/cil.ml @@ -248,11 +248,6 @@ let find_default_requires behaviors = try (List.find is_default_behavior behaviors).b_requires with Not_found -> [] -let rec stripInfo e = - match e.enode with - | Info(e',_) -> stripInfo e' - | _ -> e - let rec addOffset (toadd: offset) (off: offset) : offset = match off with | NoOffset -> toadd @@ -2210,8 +2205,7 @@ and childrenExp (vis: cilVisitor) (e: exp) : exp = let vTyp t = visitCilType vis t in let vLval lv = visitCilLval vis lv in let new_exp e' = { e with enode = e' } in - match (stripInfo e).enode with - | Info _ -> assert false + match e.enode with | Const c -> let c' = visitCilConst vis c in if c' != c then new_exp (Const c') else e @@ -3457,35 +3451,9 @@ let block_from_unspecified_sequence us = let rec stripCasts (e: exp) = match e.enode with CastE(_, e') -> stripCasts e' | _ -> e -let rec stripCastsAndInfo (e: exp) = - match e.enode with Info(e',_) | CastE(_,e') -> stripCastsAndInfo e' | _ -> e - -let rec stripCastsButLastInfo (e: exp) = - match e.enode with - Info({enode = (Info _ | CastE _)} as e',_) - | CastE(_,e') -> - stripCastsButLastInfo e' - | _ -> e - let rec stripTermCasts (t: term) = match t.term_node with TCastE(_, t') -> stripTermCasts t' | _ -> t -let exp_info_of_term t = { exp_type = t.term_type; exp_name = t.term_name;} - -let term_of_exp_info loc tnode einfo = - { - term_node = tnode; term_loc = loc; - term_type = einfo.exp_type; term_name = einfo.exp_name; - } - -let map_under_info f e = match e.enode with - | Info(e,einfo) -> new_exp ~loc:e.eloc (Info(f e,einfo)) - | _ -> f e - -let app_under_info f e = match e.enode with - | Info(e,_) -> f e - | _ -> f e - (* Separate out the storage-modifier name attributes *) let separateStorageModifiers (al: attribute list) = let isstoragemod (Attr(an, _) | AttrAnnot an : attribute) : bool = @@ -3708,8 +3676,7 @@ let no_op_coerce typ t = (**** Compute the type of an expression ****) let rec typeOf (e: exp) : typ = - match (stripInfo e).enode with - | Info _ -> assert false + match e.enode with | Const(CInt64 (_, ik, _)) -> TInt(ik, []) (* Character constants have type int. ISO/IEC 9899:1999 (E), @@ -4678,7 +4645,6 @@ and constFold (machdep: bool) (e: exp) : exp = | Lval lv -> new_exp ~loc (Lval (constFoldLval machdep lv)) | AddrOf lv -> new_exp ~loc (AddrOf (constFoldLval machdep lv)) | StartOf lv -> new_exp ~loc (StartOf (constFoldLval machdep lv)) - | Info _ -> e (* Deprecated constructor *) and constFoldLval machdep (host,offset) = let newhost = @@ -4746,8 +4712,6 @@ and constFoldBinOp ~loc (machdep: bool) bop e1 e2 tres = when Integer.equal z Integer.zero -> e1'' | PlusPI, _, Const(CInt64(z,_,_)) when Integer.equal z Integer.zero -> e1'' - | IndexPI, _, Const(CInt64(z,_,_)) - when Integer.equal z Integer.zero -> e1'' | MinusPI, _, Const(CInt64(z,_,_)) when Integer.equal z Integer.zero -> e1'' | PlusA, Const(CInt64(i1,ik1,_)),Const(CInt64(i2,ik2,_)) when ik1 = ik2 -> @@ -5806,8 +5770,7 @@ let isVariadicListType t = match unrollTypeSkel t with | TBuiltin_va_list _ -> true | _ -> false -let rec isConstantGen f e = match (stripInfo e).enode with - | Info _ -> assert false +let rec isConstantGen f e = match e.enode with | Const c -> f c | UnOp (_, e, _) -> isConstantGen f e | BinOp (_, e1, e2, _) -> isConstantGen f e1 && isConstantGen f e2 @@ -5946,7 +5909,7 @@ let mkBinOp ~loc op e1 e2 = (mkCastT t1 t1' e1) (mkCastT t2 t2' e2) t1' | (PlusA|MinusA) when isArithmeticType t1 && isArithmeticType t2 -> doArithmetic () - | (PlusPI|MinusPI|IndexPI) when isPointerType t1 && isIntegralType t2 -> + | (PlusPI|MinusPI) when isPointerType t1 && isIntegralType t2 -> constFoldBinOp ~loc machdep op e1 e2 t1 | MinusPP when isPointerType t1 && isPointerType t2 -> (* NB: Same as cabs2cil. Check if this is really what the standard says*) @@ -6040,19 +6003,30 @@ let increm64 (e: exp) i = false (new_exp ~loc:e.eloc (BinOp(bop, e, kinteger64 ~loc:e.eloc i, et))) -exception LenOfArray +type incorrect_array_length = Not_constant | Not_integer | Negative | Too_big + +let pp_incorrect_array_length fmt = function + | Not_constant -> Format.pp_print_string fmt "not a compile-time constant" + | Negative -> Format.pp_print_string fmt "negative" + | Not_integer -> Format.pp_print_string fmt "not an integral constant" + | Too_big -> Format.pp_print_string fmt "too big" + +exception LenOfArray of incorrect_array_length + let lenOfArray64 eo = match eo with - None -> raise LenOfArray + None -> raise (LenOfArray Not_constant) | Some e -> begin match (constFold true e).enode with | Const(CInt64(ni, _, _)) when Integer.ge ni Integer.zero -> ni - | _ -> raise LenOfArray + | Const(CInt64 _) -> raise (LenOfArray Negative) + | Const _ -> raise (LenOfArray Not_integer) + | _ -> raise (LenOfArray Not_constant) end let lenOfArray eo = match Integer.to_int_opt (lenOfArray64 eo) with - | None -> raise LenOfArray + | None -> raise (LenOfArray Too_big) | Some l -> l (*** Make an initializer for zeroing a data type ***) diff --git a/src/kernel_services/ast_queries/cil.mli b/src/kernel_services/ast_queries/cil.mli index 60fc27a28efcc9200a5dec223571154adc3803b8..7ff62082737e28f5106fcc638ac6d0aec5f2bbb7 100644 --- a/src/kernel_services/ast_queries/cil.mli +++ b/src/kernel_services/ast_queries/cil.mli @@ -613,10 +613,17 @@ val isArrayType: typ -> bool (** True if the argument is a struct of union type *) val isStructOrUnionType: typ -> bool +(** possible causes for raising {!Cil.LenOfArray} *) +type incorrect_array_length = Not_constant | Not_integer | Negative | Too_big + +val pp_incorrect_array_length: + Format.formatter -> incorrect_array_length -> unit + (** Raised when {!Cil.lenOfArray} fails either because the length is [None], * because it is a non-constant expression, or because it overflows an int. *) -exception LenOfArray +exception LenOfArray of incorrect_array_length + (** Call to compute the array length as present in the array type, to an * integer. Raises {!Cil.LenOfArray} if not able to compute the length, such @@ -1008,28 +1015,6 @@ val stripTermCasts: term -> term "(A)(B)(x + (C)y)", but leave the (C) cast. *) val stripCasts: exp -> exp -(** Removes info wrappers and return underlying expression *) -val stripInfo: exp -> exp - -(** Removes casts and info wrappers and return underlying expression *) -val stripCastsAndInfo: exp -> exp - -(** Removes casts and info wrappers,except last info wrapper, and return - underlying expression *) -val stripCastsButLastInfo: exp -> exp - -(** Extracts term information in an expression information *) -val exp_info_of_term: term -> exp_info - -(** Constructs a term from a term node and an expression information *) -val term_of_exp_info: location -> term_node -> exp_info -> term - -(** Map some function on underlying expression if Info or else on expression *) -val map_under_info: (exp -> exp) -> exp -> exp - -(** Apply some function on underlying expression if Info or else on expression *) -val app_under_info: (exp -> unit) -> exp -> unit - val typeOf: exp -> typ (** Compute the type of an expression. *) diff --git a/src/kernel_services/ast_queries/cil_builtins.ml b/src/kernel_services/ast_queries/cil_builtins.ml index b277e1816068ecccf83a7159991706863b24f567..04223c4e6ebea5603ea306eb6880a9a238c6b43c 100644 --- a/src/kernel_services/ast_queries/cil_builtins.ml +++ b/src/kernel_services/ast_queries/cil_builtins.ml @@ -645,7 +645,9 @@ let initGccBuiltins () : unit = true; | None -> ()) atomic_instances; - add ~prefix:"" "__sync_synchronize" voidType [] true + (* __sync_synchronize has been declared non-variadic and a spec was added + to __fc_gcc_builtins.h; to avoid issues with pretty-printing, we removed + it from this list. *) ;; (* Builtins related to va_list. Added to all non-msvc machdeps, because diff --git a/src/kernel_services/ast_queries/cil_datatype.ml b/src/kernel_services/ast_queries/cil_datatype.ml index 6c438f5dd51da9fd580b0ae03731c1c1a586a0ac..ee6d4ef5573f305005e6e8ca321218f73bf56986 100644 --- a/src/kernel_services/ast_queries/cil_datatype.ml +++ b/src/kernel_services/ast_queries/cil_datatype.ml @@ -1042,11 +1042,6 @@ struct | AddrOf _, _ -> 1 | _, AddrOf _ -> -1 | StartOf lv1, StartOf lv2 -> compare_lval ~strict lv1 lv2 - | StartOf _, _ -> 1 - | _, StartOf _ -> -1 - | Info _, Info _ -> - Cmdline.Kernel_log.fatal - "[exp_compare] Info node is obsolete. Do not use it" and compare_lval ~strict (h1,o1) (h2,o2) = let res = compare_lhost ~strict h1 h2 in @@ -1093,9 +1088,6 @@ struct | CastE(ty,e) -> hash_exp ((prime*acc) lxor Typ.hash ty) e | AddrOf lv -> hash_lval (prime*acc lxor 329) lv | StartOf lv -> hash_lval (prime*acc lxor 431) lv - | Info _ -> - Cmdline.Kernel_log.fatal - "Info node is deprecated and should not be used@." and hash_lval acc (h,o) = hash_offset ((prime * acc) lxor hash_lhost 856 h) o and hash_lhost acc = function diff --git a/src/kernel_services/ast_queries/logic_typing.ml b/src/kernel_services/ast_queries/logic_typing.ml index b8c0cc94f21d40b61fbda1551f41c15d66d7b4cb..b2b63a486c0840c33b6eb25e45e7ec4f9e592474 100644 --- a/src/kernel_services/ast_queries/logic_typing.ml +++ b/src/kernel_services/ast_queries/logic_typing.ml @@ -482,7 +482,6 @@ module Type_namespace = let hash : t -> int = Hashtbl.hash end) - type typing_context = { is_loop: unit -> bool; anonCompFieldName : string; @@ -520,7 +519,7 @@ type typing_context = { Lenv.t -> Logic_ptree.assigns -> Cil_types.assigns; error: 'a 'b. location -> ('a,formatter,unit,'b) format4 -> 'a; - on_error: 'a 'b. ('a -> 'b) -> (unit -> unit) -> 'a -> 'b + on_error: 'a 'b. ('a -> 'b) -> ((location * string) -> unit) -> 'a -> 'b } module Extensions = struct @@ -656,7 +655,7 @@ module Make val find_logic_ctor: string -> logic_ctor_info val integral_cast: Cil_types.typ -> Cil_types.term -> Cil_types.term val error: location -> ('a,formatter,unit, 'b) format4 -> 'a - val on_error: ('a -> 'b) -> (unit -> unit) -> 'a -> 'b + val on_error: ('a -> 'b) -> ((location * string) -> unit) -> 'a -> 'b end) = struct @@ -1767,7 +1766,7 @@ struct Logic_const.tat ~loc (add_offset lv here_idx,lab) | _ -> let b = - { term_node = TBinOp (IndexPI, t, idx); term_name = []; + { term_node = TBinOp (PlusPI, t, idx); term_name = []; term_loc = loc; term_type = set_conversion t.term_type idx.term_type } in @@ -4305,7 +4304,7 @@ struct let res = annot false a in finish_transaction (); res - let annot = C.on_error annot rollback_transaction + let annot = C.on_error annot (fun _ -> rollback_transaction ()) end diff --git a/src/kernel_services/ast_queries/logic_typing.mli b/src/kernel_services/ast_queries/logic_typing.mli index 838eede9a178bc670da52354425b8a4571119714..1b02633a34bbbb2319c376371285225ca8349465 100644 --- a/src/kernel_services/ast_queries/logic_typing.mli +++ b/src/kernel_services/ast_queries/logic_typing.mli @@ -33,7 +33,7 @@ val type_rel: Logic_ptree.relation -> Cil_types.relation (** Arithmetic binop conversion. Addition and Subtraction are always considered as being used on integers. It is the responsibility of the - user to introduce PlusPI/IndexPI, MinusPI and MinusPP where needed. + user to introduce PlusPI, MinusPI and MinusPP where needed. @since Nitrogen-20111001 *) val type_binop: Logic_ptree.binop -> Cil_types.binop @@ -143,12 +143,14 @@ type typing_context = { error: 'a 'b. location -> ('a,Format.formatter,unit,'b) format4 -> 'a; (** [on_error f rollback x] will attempt to evaluate [f x]. If this triggers - an error while in [-continue-annot-error] mode, [rollback ()] will be - executed and the exception re-raised. + an error while in [-continue-annot-error] mode, [rollback (loc,cause)] + will be executed (where [loc] is the location of the error and [cause] + a text message indicating the issue) and the exception will be re-raised. @since Chlorine-20180501 + @modify Frama-C+dev rollback takes as argument the error *) - on_error: 'a 'b. ('a -> 'b) -> (unit -> unit) -> 'a -> 'b + on_error: 'a 'b. ('a -> 'b) -> ((location * string) -> unit) -> 'a -> 'b } module Make @@ -192,7 +194,7 @@ module Make val error: location -> ('a,Format.formatter,unit, 'b) format4 -> 'a (** see {!Logic_typing.typing_context}. *) - val on_error: ('a -> 'b) -> (unit -> unit) -> 'a -> 'b + val on_error: ('a -> 'b) -> ((location * string) -> unit) -> 'a -> 'b end) : sig diff --git a/src/kernel_services/ast_queries/logic_utils.ml b/src/kernel_services/ast_queries/logic_utils.ml index 4131258363e4c9061a648e697590d3f603aea9a3..d7e5d704db6d2a83a7466a157c835b1eb66b64e9 100644 --- a/src/kernel_services/ast_queries/logic_utils.ml +++ b/src/kernel_services/ast_queries/logic_utils.ml @@ -418,7 +418,7 @@ let is_boolean_binop op = let open Cil_types in match op with | Lt | Gt | Le | Ge | Eq | Ne | LAnd | LOr -> true - | PlusA | PlusPI | IndexPI | MinusA | MinusPI | MinusPP + | PlusA | PlusPI | MinusA | MinusPI | MinusPP | Mult | Div | Mod | Shiftlt | Shiftrt | BAnd | BXor | BOr -> false let float_builtin prefix fkind = @@ -505,9 +505,6 @@ let rec expr_to_term ?(coerce=false) e = let coerce = Cil.isIntegralType (Cil.typeOf e) in let t = mk_cast ~loc ty (expr_to_term ~coerce e) in t.term_node , t.term_type - | Info (e,_) -> - let t = expr_to_term ~coerce e in - t.term_node , t.term_type in let v = mk_cast ~loc typ @@ Logic_const.term ~loc node ltyp in if coerce then @@ -891,7 +888,7 @@ let is_same_pconstant c1 c2 = let is_same_binop o1 o2 = match o1,o2 with | PlusA, PlusA - | (PlusPI | IndexPI), (PlusPI | IndexPI) (* Semantically equivalent *) + | PlusPI, PlusPI | MinusA, MinusA | MinusPI, MinusPI | MinusPP, MinusPP @@ -912,7 +909,7 @@ let is_same_binop o1 o2 = | LAnd, LAnd | LOr, LOr -> true - | (PlusA | PlusPI | IndexPI | MinusA | MinusPI | MinusPP | Mult | Div + | (PlusA | PlusPI | MinusA | MinusPI | MinusPP | Mult | Div | Mod | Shiftlt | Shiftrt | Cil_types.Lt | Cil_types.Gt | Cil_types.Le | Cil_types.Ge | Cil_types.Eq | Cil_types.Ne | BAnd | BXor | BOr | LAnd | LOr), _ -> @@ -2529,7 +2526,7 @@ and constFoldBinOpToInt ~machdep bop e1 e2 = match bop with | PlusA -> Some (Integer.add i1 i2) | MinusA -> Some (Integer.sub i1 i2) - | PlusPI | IndexPI | MinusPI | MinusPP -> None + | PlusPI | MinusPI | MinusPP -> None | Mult -> Some (Integer.mul i1 i2) | Div -> if Integer.(equal zero i2) && Integer.(is_zero (e_rem i1 i2)) then None diff --git a/src/kernel_services/plugin_entry_points/db.mli b/src/kernel_services/plugin_entry_points/db.mli index ba5d56d1bd184252fcc2bfd31ecaef5405b1d98c..636ec1d8bd5a8f8b59f10256faf861772fc4edd7 100644 --- a/src/kernel_services/plugin_entry_points/db.mli +++ b/src/kernel_services/plugin_entry_points/db.mli @@ -37,7 +37,7 @@ - {!File}: Cil file initialization - {!Globals}: global variables, functions and annotations - {!Annotations}: annotations associated with a statement - - {!Properties_status}: status of annotations + - {!Property_status}: status of annotations - {!Kernel_function}: C functions as seen by Frama-C - {!Stmts_graph}: the statement graph - {!Loop}: (natural) loops diff --git a/src/kernel_services/plugin_entry_points/emitter.ml b/src/kernel_services/plugin_entry_points/emitter.ml index d44861ba06cd48b63905c295e0fa67284b34b33c..9f5ada97cc5e2a407f0dd6ea0b06003a43b9a9d9 100644 --- a/src/kernel_services/plugin_entry_points/emitter.ml +++ b/src/kernel_services/plugin_entry_points/emitter.ml @@ -23,10 +23,6 @@ (* Modules [Hashtbl] and [Kernel] are not usable here. Thus use above modules instead. *) -(**************************************************************************) -(** {2 Datatype} *) -(**************************************************************************) - type kind = Property_status | Alarm | Code_annot | Funspec | Global_annot type emitter = @@ -35,6 +31,59 @@ type emitter = tuning_parameters: Typed_parameter.t list; correctness_parameters: Typed_parameter.t list } +(**************************************************************************) +(** {2 Implementation for Plug-in Developers} *) +(**************************************************************************) + +let names: unit Datatype.String.Hashtbl.t = Datatype.String.Hashtbl.create 7 + +let create name kinds ~correctness ~tuning = + if Datatype.String.Hashtbl.mem names name then + Kernel.fatal "emitter %s already exists with the same parameters" name; + let e = + { name = name; + kinds = kinds; + correctness_parameters = correctness; + tuning_parameters = tuning } + in + Datatype.String.Hashtbl.add names name (); + e + +let dummy = create "dummy" [] ~correctness:[] ~tuning:[] + +let get_name e = e.name + +let correctness_parameters e = + List.map (fun p -> p.Typed_parameter.name) e.correctness_parameters + +let tuning_parameters e = + List.map (fun p -> p.Typed_parameter.name) e.tuning_parameters + +let end_user = + create + "End-User" + [ Property_status; Code_annot; Funspec; Global_annot ] + ~correctness:[] + ~tuning:[] + +let kernel = + create + "Frama-C kernel" + [ Property_status; Funspec ] + ~correctness:[] + ~tuning:[] + +let orphan = + create + "Orphan" + [ Code_annot; Funspec; Global_annot ] + ~correctness:[] + ~tuning:[] + +(**************************************************************************) +(** {2 Datatype} *) +(**************************************************************************) + module D = Datatype.Make_with_collections (struct @@ -106,7 +155,7 @@ module Usable_emitter = struct let mem_project = Datatype.never_any_project end) - let get e = + let unsafe_get e = let get_params map = Datatype.String.Map.fold (fun s _ acc -> Typed_parameter.get s :: acc) @@ -118,6 +167,13 @@ module Usable_emitter = struct correctness_parameters = get_params e.correctness_values; tuning_parameters = get_params e.tuning_values } + (* In some cases, e.g. when loading a state with a different set + of plugins loaded, the original emitter might not be available, + leading to discarding annotations. Let the kernel adopt them. *) + let get e = + try unsafe_get e + with Not_found -> orphan + let get_name e = e.u_name let get_unique_name e = Format.asprintf "%a" pretty e @@ -134,55 +190,6 @@ module Usable_emitter = struct end -(**************************************************************************) -(** {2 Implementation for Plug-in Developers} *) -(**************************************************************************) - -let names: unit Datatype.String.Hashtbl.t = Datatype.String.Hashtbl.create 7 - -let create name kinds ~correctness ~tuning = - if Datatype.String.Hashtbl.mem names name then - Kernel.fatal "emitter %s already exists with the same parameters" name; - let e = - { name = name; - kinds = kinds; - correctness_parameters = correctness; - tuning_parameters = tuning } - in - Datatype.String.Hashtbl.add names name (); - e - -let dummy = create "dummy" [] ~correctness:[] ~tuning:[] - -let get_name e = e.name - -let correctness_parameters e = - List.map (fun p -> p.Typed_parameter.name) e.correctness_parameters - -let tuning_parameters e = - List.map (fun p -> p.Typed_parameter.name) e.tuning_parameters - -let end_user = - create - "End-User" - [ Property_status; Code_annot; Funspec; Global_annot ] - ~correctness:[] - ~tuning:[] - -let kernel = - create - "Frama-C kernel" - [ Property_status; Funspec ] - ~correctness:[] - ~tuning:[] - -let orphan = - create - "Orphan" - [ Code_annot; Funspec; Global_annot ] - ~correctness:[] - ~tuning:[] - (**************************************************************************) (** {2 State of all known emitters} *) (**************************************************************************) diff --git a/src/plugins/aorai/aorai_eva_analysis.enabled.ml b/src/plugins/aorai/aorai_eva_analysis.enabled.ml index 86437066d6b713ffaf8ab5bd60984cea227a78f9..8b007c55b15b021ba234a5d76899eb55587c0967 100644 --- a/src/plugins/aorai/aorai_eva_analysis.enabled.ml +++ b/src/plugins/aorai/aorai_eva_analysis.enabled.ml @@ -70,9 +70,8 @@ let add_slevel_annotation vi kind = | Aorai_visitors.Aux_funcs.(Pre _ | Post _) -> let kf = Globals.Functions.get vi in let stmt = Kernel_function.find_first_stmt kf - and loc = Kernel_function.get_location kf and emitter = Aorai_option.emitter in - Eva.Eva_annotations.(add_slevel_annot ~emitter ~loc stmt SlevelFull) + Eva.Eva_annotations.(add_slevel_annot ~emitter stmt SlevelFull) | _ -> () let add_slevel_annotations () = diff --git a/src/plugins/aorai/data_for_aorai.ml b/src/plugins/aorai/data_for_aorai.ml index e46dd0eceea1402a7fb1445203ca096edf5c2a54..14d19b1b0859e3d71be9a323212c2af3d35c030d 100644 --- a/src/plugins/aorai/data_for_aorai.ml +++ b/src/plugins/aorai/data_for_aorai.ml @@ -851,13 +851,13 @@ let type_expr metaenv env ?tr ?current e = && Logic_typing.is_integral_type t2.term_type then Logic_const.term - (TBinOp (IndexPI,t1,t2)) + (TBinOp (PlusPI,t1,t2)) (Logic_typing.type_of_pointed t1.term_type) else if Logic_utils.isLogicPointerType t2.term_type && Logic_typing.is_integral_type t1.term_type then Logic_const.term - (TBinOp (IndexPI,t2,t1)) + (TBinOp (PlusPI,t2,t1)) (Logic_typing.type_of_pointed t2.term_type) else if Logic_utils.isLogicArrayType t1.term_type && Logic_typing.is_integral_type t2.term_type diff --git a/src/plugins/callgraph/uses.ml b/src/plugins/callgraph/uses.ml index 2befdd59d1ab047dc12cfa9386e53166c8c8f991..728eae5ed726f01dcec646b1bdb66cb421682d6d 100644 --- a/src/plugins/callgraph/uses.ml +++ b/src/plugins/callgraph/uses.ml @@ -73,6 +73,15 @@ let iter_in_rev_order = in fun f -> I.iter (Cg.get ()) f +let _iter_in_rev_order = + Dynamic.register + ~comment:"Iterate over all the functions in the callgraph in reverse order" + ~plugin:Options.name + "iter_in_rev_order" + Datatype.(func (func Kernel_function.ty unit) unit) + ~journalize:false + iter_in_rev_order + let iter_on_aux iter_dir f kf = let cg = Cg.get () in if Cg.G.mem_vertex cg kf then @@ -116,6 +125,16 @@ let accept_base ~with_formals ~with_locals kf v = | true , _, Declaration (_, vd, _, _) -> Base.is_formal_of_prototype v vd) || is_local_or_formal_of_caller v kf +let _accept_base = + Dynamic.register + ~comment:"Returns [true] if the given base is a global, \ + or a formal or local of either [kf] or one of its callers" + ~plugin:Options.name + "accept_base" + Datatype.(func2 Kernel_function.ty Base.ty bool) + ~journalize:false + (fun kf b -> accept_base ~with_formals:true ~with_locals:true kf b) + let nb_calls () = let g = Cg.get () in (* [g] contains bidirectional edges (from caller to callee and diff --git a/src/plugins/e-acsl/.gitignore b/src/plugins/e-acsl/.gitignore index 5305de804b9f36c4c6293b3620264af6c6e76f79..8210bbba35b035889b55426c072572fa139770cb 100644 --- a/src/plugins/e-acsl/.gitignore +++ b/src/plugins/e-acsl/.gitignore @@ -50,15 +50,9 @@ /doc/userman/*.log /doc/userman/*.lof /doc/userman/eacslversion.tex -/tests/*.cm* -/tests/*.annot -/tests/*_DEP /tests/test_config -/tests/test_config_ci /tests/test_config_dev /tests/*/result*/* -/tests/*/oracle_ci/* -/tests/check/obj/* .frama-c META.frama-c-e_acsl .merlin @@ -75,6 +69,5 @@ lib/libeacsl-rtl-bittree.a lib/libeacsl-rtl-segment.a lib/libeacsl-rtl-bittree-dbg.a lib/libeacsl-rtl-segment-dbg.a -tests/csrv14/* src/local_config.ml src/dependencies/dep_eva.ml diff --git a/src/plugins/e-acsl/E_ACSL.ml b/src/plugins/e-acsl/E_ACSL.ml index 935c38cc56dab1ae774179f4c648a288b281333c..4e2f2ee8777cc6f55b99035731a089ebd19df6b9 100644 --- a/src/plugins/e-acsl/E_ACSL.ml +++ b/src/plugins/e-acsl/E_ACSL.ml @@ -24,6 +24,7 @@ open Cil_types +module Options = Options module Error = Error module Translate_terms = Translate_terms diff --git a/src/plugins/e-acsl/E_ACSL.mli b/src/plugins/e-acsl/E_ACSL.mli index 1b68985666fefd13c46a870f943d8e62705ccd83..d6d9aa9833290d36583e44637995e398d2fbe80e 100644 --- a/src/plugins/e-acsl/E_ACSL.mli +++ b/src/plugins/e-acsl/E_ACSL.mli @@ -24,9 +24,13 @@ open Cil_types +module Options: sig + type category +end + module Error: sig - exception Typing_error of string - exception Not_yet of string + exception Typing_error of Options.category option * string + exception Not_yet of Options.category option * string end module Translate_terms: sig diff --git a/src/plugins/e-acsl/Makefile.in b/src/plugins/e-acsl/Makefile.in index 25672c530b45fa6983742a093f233076eb1393e4..f73d51faec339ec281bc3ce71f9e1d7e1d706642 100644 --- a/src/plugins/e-acsl/Makefile.in +++ b/src/plugins/e-acsl/Makefile.in @@ -56,7 +56,13 @@ SRC_PROJECT_INITIALIZER:=\ $(addprefix src/project_initializer/, $(SRC_PROJECT_INITIALIZER)) # analyses +ANALYSES_CMI:= \ + analyses_types +ANALYSES_CMI:=$(addprefix src/analyses/, $(ANALYSES_CMI)) + SRC_ANALYSES:= \ + analyses_datatype \ + label \ rte \ lscope \ e_acsl_visitor \ @@ -66,7 +72,8 @@ SRC_ANALYSES:= \ typing \ literal_strings \ memory_tracking \ - exit_points + exit_points \ + analyses SRC_ANALYSES:=$(addprefix src/analyses/, $(SRC_ANALYSES)) # code generator @@ -75,10 +82,10 @@ CODE_GENERATOR_CMI:= \ CODE_GENERATOR_CMI:=$(addprefix src/code_generator/, $(CODE_GENERATOR_CMI)) SRC_CODE_GENERATOR:= \ + translation_error \ smart_exp \ smart_stmt \ gmp \ - label \ env \ assert \ rational \ @@ -126,6 +133,8 @@ PLUGIN_CMO:= src/local_config \ $(SRC_CODE_GENERATOR) \ src/main PLUGIN_CMI:= \ + $(LIBRARIES_CMI) \ + $(ANALYSES_CMI) \ $(CODE_GENERATOR_CMI) PLUGIN_HAS_MLI:=yes PLUGIN_DISTRIBUTED:=yes @@ -160,7 +169,7 @@ VERSION_FILE=$(FRAMAC_ROOT_SRCDIR)/VERSION EACSL_VERSION:=$(shell sed -e 's/\\(.*\\)/\\1/' $(VERSION_FILE)) -$(EACSL_PLUGIN_DIR)/src/local_config.ml: $(EACSL_PLUGIN_DIR)/Makefile.in $(VERSION_FILE) +$(EACSL_PLUGIN_DIR)/src/local_config.ml: $(EACSL_PLUGIN_DIR)/Makefile $(VERSION_FILE) $(PRINT_MAKING) $@ $(RM) $@ $(ECHO) "(* This file was automatically generated from $<. Don't edit it. *)" >> $@ @@ -178,6 +187,7 @@ ifeq (@MAY_RUN_TESTS@,yes) PLUGIN_TESTS_DIRS := \ examples \ bts \ + concurrency \ constructs \ arith \ memory \ @@ -215,11 +225,13 @@ TEST_DEPENDENCIES += \ $(EACSL_PLUGIN_DIR)/tests/E_ACSL_test.cmxs endif +ifneq ("$(PLUGIN_ENABLE)","no") # Add the test dependencies to the test targets, but also to # `plugins_ptests_config` so that they are built along with the main target. plugins_ptests_config: $(TEST_DEPENDENCIES) E_ACSL_TESTS E_ACSL_DEFAULT_TESTS: $(TEST_DEPENDENCIES) tests:: $(TEST_DEPENDENCIES) +endif $(EACSL_PLUGIN_DIR)/tests/test_config: \ $(EACSL_PLUGIN_DIR)/tests/test_config.in \ @@ -270,9 +282,11 @@ EACSL_DLMALLOC_FLAGS = \ -DMSPACES=1 \ -DONLY_MSPACES \ -DMALLOC_ALIGNMENT=32 \ - -DMSPACE_PREFIX="__e_acsl_" + -DMSPACE_PREFIX="__e_acsl_" \ + -DUSE_LOCKS=1 \ + -DUSE_SPIN_LOCKS=1 -$(EACSL_DLMALLOC_LIB): $(EACSL_DLMALLOC_SRC) +$(EACSL_DLMALLOC_LIB): $(EACSL_DLMALLOC_SRC) $(EACSL_PLUGIN_DIR)/Makefile $(MKDIR) $(EACSL_LIBDIR) echo 'CC $<' $(CC) $< -c -O2 -g3 -o$(EACSL_DLMALLOC_OBJ) $(EACSL_DLMALLOC_FLAGS) @@ -281,10 +295,12 @@ $(EACSL_DLMALLOC_LIB): $(EACSL_DLMALLOC_SRC) echo 'RANLIB $@' ranlib $@ +ifneq ("$(PLUGIN_ENABLE)","no") all:: $(EACSL_DLMALLOC_LIB) clean:: $(RM) $(EACSL_DLMALLOC_LIB) +endif ############ # Cleaning # @@ -350,7 +366,9 @@ EACSL_TEST_FILES = \ tests/temporal/test_config_dev \ tests/format/test_config \ tests/format/test_config_dev \ - tests/E_ACSL_test.ml \ + tests/concurrency/test_config \ + tests/concurrency/test_config_dev \ + tests/E_ACSL_test.ml EACSL_TESTS_C_FILES = \ $(foreach dir, $(addprefix tests/,$(PLUGIN_TESTS_DIRS)), \ diff --git a/src/plugins/e-acsl/doc/Changelog b/src/plugins/e-acsl/doc/Changelog index 65dc019e650c436f6e781a36215d59a4f1218070..3fbd174366f6ea7a3dbd1be7cdd868800ee3e4af 100644 --- a/src/plugins/e-acsl/doc/Changelog +++ b/src/plugins/e-acsl/doc/Changelog @@ -25,6 +25,7 @@ Plugin E-ACSL <next-release> ############################ +- E-ACSL [2022-01-28] Add Linux's pthread concurrency support. -* E-ACSL [2021-12-03] Fix crash when creating an axiomatic with an existing name in E-ACSL's RTL (frama-c/e-acsl#161). -* E-ACSL [2021-12-01] Fix crash when binding a lambda-abstraction to a @@ -34,10 +35,10 @@ Plugin E-ACSL <next-release> -* E-ACSL [2021-11-23] Add support for VDSO segment on Linux. -* e-acsl-gcc [2021-11-22] Fix e-acsl-gcc.sh detection of failures in subcommands. -- E-ACSL [2021-11-03] Improve runtime debug logs: the %a modifier now +- runtime [2021-11-03] Improve runtime debug logs: the %a modifier now outputs in hexadecimal, the debug logs now all end in new lines, the trace now outputs to stderr. --* E-ACSL [2021-11-03] Fix default stack size: E_ACSL_STACK_SIZE +-* runtime [2021-11-03] Fix default stack size: E_ACSL_STACK_SIZE is now correctly used by the runtime, the default values have been adjusted to what was effectively used. -* E-ACSL [2021-11-03] Now the same Frama-C options are used when parsing diff --git a/src/plugins/e-acsl/doc/userman/changes.tex b/src/plugins/e-acsl/doc/userman/changes.tex index 23a76db94725e69c99f6ea9376463c01b72fbcc2..1b8489a9bb509558668f005b7057a4e08c5b7bcc 100644 --- a/src/plugins/e-acsl/doc/userman/changes.tex +++ b/src/plugins/e-acsl/doc/userman/changes.tex @@ -6,6 +6,12 @@ release. First we list changes of the last release. % Next version %\section*{E-ACSL \eacslpluginversion \eacslplugincodename} +\section*{E-ACSL \eacslpluginversion \eacslplugincodename} + +\begin{itemize} +\item New section \textbf{Concurrency Support}. +\end{itemize} + \section*{E-ACSL 24.0 Chromium} \begin{itemize} diff --git a/src/plugins/e-acsl/doc/userman/provides.tex b/src/plugins/e-acsl/doc/userman/provides.tex index 8c7055d64dcebd9fa0d79502a989828e242ab435..fd162c8c44db96a546cbf505d83dd8dc0e6ef730 100644 --- a/src/plugins/e-acsl/doc/userman/provides.tex +++ b/src/plugins/e-acsl/doc/userman/provides.tex @@ -101,19 +101,19 @@ Using \shortopt{ocode} \framac~\cite{userman} option, the code generated by the \framac uses architecture-dependent configuration which affects sizes of integer types, endianness and potentially other features. It can be seen that the code generated from \texttt{first.i} (shown in the -previous section) defines \C type \texttt{size\_t} as \texttt{unsigned int}, whereas -in 64-bit architectures \texttt{size\_t} is typically defined as -\texttt{unsigned long}. Architecture used during \framac translation is +previous section) defines \C type \texttt{size\_t} as \texttt{unsigned long}, whereas +in 32-bit architectures \texttt{size\_t} is typically defined as +\texttt{unsigned int}. The architecture used during \framac translation is controlled through \framac \shortopt{machdep} option that specifies the architecture type to use during translation. The default value of -\shortopt{machdep} is \texttt{x86\_32} (a generic 32-bit x86 architecture). +\shortopt{machdep} is \texttt{x86\_64} (a generic 64-bit x86 architecture). Note that since code generated by \eacsl is aimed at being compiled it is important that the architecture used by \framac matches the architecture -corresponding to your compiler and your system. For instance, in a 64-bit +corresponding to your compiler and your system. For instance, in a 32-bit machine you should also pass -\shortopt{machdep} \texttt{x86\_64} option as follows: +\shortopt{machdep} \texttt{x86\_32} option as follows: \begin{shell} -\$ frama-c -machdep x86_64 -e-acsl first.i -then-last \ +\$ frama-c -machdep x86_32 -e-acsl first.i -then-last \ -print -ocode monitored_first.c \end{shell} @@ -286,7 +286,7 @@ compiled on the very same architecture (or cross-compiled for it) for the compiler being able to generate a correct binary. \framac makes assumptions about the machine architecture when analyzing source -code. By default, it assumes an X86 32-bit platform, but it can be customized +code. By default, it assumes an X86 64-bit platform, but it can be customized through \shortopt{machdep} switch~\cite{userman}. This option is of primary importance when using the \eacsl plug-in: it must be set to the value corresponding to the machine architecture which the generated code will be @@ -305,6 +305,101 @@ further passed \shortopt{m64} or \shortopt{m32} options to generate code using At the present stage of implementation \eacsl does not support generating executables with ABI different to the default one. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\subsection{Concurrency Support}\label{sec:eacsl-gcc:concurrency} + +\subsubsection{How to Activate Concurrency} + +\eacsl supports the monitoring of Linux's \texttt{pthreads} concurrent code by +using the option \longopt{concurrency} of \eacslgcc. + +Example of compilation with concurrency support using \eacslgcc: +\begin{shell} + \$ e-acsl-gcc.sh -c foo.c --concurrency -o foo.frama.c -O foo +\end{shell} + +The concurrency support is a two part activation: first the +\longopt{e-acsl-concurrency} \framac option is enabled to generate concurrent +ready code, then when compiling the generated code, the preprocessor variable +\texttt{E\_ACSL\_CONCURRENCY\_PTHREAD} is defined and the linker option +\shortopt{pthread} is added. + +Example of compilation with concurrency support using \framac and \gcc directly +(where \texttt{\$E\_ACSL\_SHARE} points to the \texttt{share/frama-c/e-acsl} +folder of \framac and \texttt{\$E\_ACSL\_LIB} points to the +\texttt{lib/frama-c/e-acsl} folder of \framac): +\begin{shell} + \$ frama-c \ + -remove-unused-specified-functions \ + -machdep gcc_x86_64 \ + -cpp-extra-args="-std=c99 -D_DEFAULT_SOURCE -D__NO_CTYPE \ + -D__FC_MACHDEP_X86_64" \ + -no-frama-c-stdlib \ + foo.c \ + -e-acsl -e-acsl-concurrency \ + -then-last -print -ocode foo.frama.c + \$ gcc \ + -std=c99 -m64 -g -O2 -fno-builtin -fno-merge-constants \ + -Wno-attributes -Wno-implicit-function-declaration \ + -DE_ACSL_SEGMENT_MMODEL -DE_ACSL_CONCURRENCY_PTHREAD \ + -I\$E_ACSL_SHARE \ + -o foo.e-acsl \ + foo.frama.c \ + \$E_ACSL_SHARE/e_acsl_rtl.c \ + -pthread \ + \$E_ACSL_LIB/libeacsl-dlmalloc.a \ + -lgmp -lm +\end{shell} + +\subsubsection{Function Contracts Limitations} + +For now, the \eacsl language~\cite{eacsl} does not support concurrent access +indications, so some care should be taken when writing specifications that +access to the shared memory. As a workaround, the memory accesses inside the +specification can be protected code outside the specification, for instance by +acquiring and releasing a lock around \eacsl assertions. + +As an example, the following code acquire the lock on a mutex before accessing +the shared global variable \texttt{a}. However, \eacsl will place the +translation of the precondition before acquiring the lock, and the translation +of the postcondition after releasing the lock. Therefore, their validity status +may vary with respect to the thread interleaving. + +\begin{minipage}{\linewidth} +\begin{ccode} +/*@ requires \valid(a) && \initialized(a); + requires \valid(b) && \initialized(b); + ensures *a == \old(*a) + 1; + ensures *b == \old(*b) + *a; */ +void f() { + pthread_mutex_lock(&lock); + *a += 1; + *b += *a; + pthread_mutex_unlock(&lock); +} +\end{ccode} +\end{minipage} + +The workaround here is to move the function contract to a statement contract +surrounded by the lock: + +\begin{minipage}{\linewidth} +\begin{ccode} +void f() { + pthread_mutex_lock(&lock); + /*@ requires \valid(a) && \initialized(a); + requires \valid(b) && \initialized(b); + ensures *a == \old(*a) + 1; + ensures *b == \old(*b) + *a; */ + { + *a += 1; + *b += *a; + } + pthread_mutex_unlock(&lock); +} +\end{ccode} +\end{minipage} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Documentation}\label{sec:eacsl-gcc:doc} diff --git a/src/plugins/e-acsl/headers/header_spec.txt b/src/plugins/e-acsl/headers/header_spec.txt index 4c8e1b257363ff9294e43b8253cadbc90388bd94..802dc2a40f546fc51414f5feedf73ac15ec21c90 100644 --- a/src/plugins/e-acsl/headers/header_spec.txt +++ b/src/plugins/e-acsl/headers/header_spec.txt @@ -26,6 +26,7 @@ share/e-acsl/instrumentation_model/e_acsl_temporal_timestamp.h: CEA_LGPL_OR_PROP share/e-acsl/internals/e_acsl_alias.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/internals/e_acsl_bits.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/internals/e_acsl_bits.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL +share/e-acsl/internals/e_acsl_concurrency.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/internals/e_acsl_config.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/internals/e_acsl_debug.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/internals/e_acsl_debug.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL @@ -33,6 +34,8 @@ share/e-acsl/internals/e_acsl_malloc.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/internals/e_acsl_malloc.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/internals/e_acsl_private_assert.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/internals/e_acsl_private_assert.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL +share/e-acsl/internals/e_acsl_rtl_error.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL +share/e-acsl/internals/e_acsl_rtl_error.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/internals/e_acsl_rtl_io.c: MODIFIED_SPARETIMELABS share/e-acsl/internals/e_acsl_rtl_io.h: MODIFIED_SPARETIMELABS share/e-acsl/internals/e_acsl_rtl_string.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL @@ -56,6 +59,8 @@ share/e-acsl/observation_model/bittree_model/e_acsl_bittree_timestamp_retrieval. share/e-acsl/observation_model/internals/e_acsl_heap_tracking.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/observation_model/internals/e_acsl_heap_tracking.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/observation_model/internals/e_acsl_omodel_debug.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL +share/e-acsl/observation_model/internals/e_acsl_patricia_trie.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL +share/e-acsl/observation_model/internals/e_acsl_patricia_trie.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/observation_model/internals/e_acsl_safe_locations.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/observation_model/internals/e_acsl_safe_locations.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/observation_model/internals/e_acsl_timestamp_retrieval.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL @@ -64,6 +69,8 @@ share/e-acsl/observation_model/segment_model/e_acsl_segment_omodel_debug.c: CEA_ share/e-acsl/observation_model/segment_model/e_acsl_segment_timestamp_retrieval.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL +share/e-acsl/observation_model/segment_model/e_acsl_shadow_concurrency.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL +share/e-acsl/observation_model/segment_model/e_acsl_shadow_concurrency.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/observation_model/e_acsl_heap.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL @@ -72,6 +79,11 @@ share/e-acsl/observation_model/e_acsl_observation_model.c: CEA_LGPL_OR_PROPRIETA share/e-acsl/observation_model/e_acsl_observation_model.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/e_acsl.h: CEA_LGPL_OR_PROPRIETARY.E_ACSL share/e-acsl/e_acsl_rtl.c: CEA_LGPL_OR_PROPRIETARY.E_ACSL +src/analyses/analyses_datatype.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL +src/analyses/analyses_datatype.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL +src/analyses/analyses.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL +src/analyses/analyses.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL +src/analyses/analyses_types.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/analyses/bound_variables.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/analyses/bound_variables.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/analyses/e_acsl_visitor.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL @@ -80,6 +92,8 @@ src/analyses/exit_points.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/analyses/exit_points.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/analyses/interval.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/analyses/interval.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL +src/analyses/label.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL +src/analyses/label.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/analyses/literal_strings.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/analyses/literal_strings.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/analyses/logic_normalizer.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL @@ -109,8 +123,6 @@ src/code_generator/gmp.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/code_generator/gmp.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/code_generator/injector.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/code_generator/injector.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL -src/code_generator/label.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL -src/code_generator/label.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/code_generator/libc.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/code_generator/libc.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/code_generator/literal_observer.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL @@ -145,6 +157,8 @@ src/code_generator/translate_terms.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/code_generator/translate_terms.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/code_generator/translate_utils.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/code_generator/translate_utils.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL +src/code_generator/translation_error.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL +src/code_generator/translation_error.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/code_generator/typed_number.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/code_generator/typed_number.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL src/libraries/builtins.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL @@ -176,6 +190,8 @@ tests/test_config.in: .ignore tests/test_config_dev.in: .ignore tests/builtin/test_config: .ignore tests/builtin/test_config_dev: .ignore +tests/concurrency/test_config: .ignore +tests/concurrency/test_config_dev: .ignore tests/format/test_config: .ignore tests/format/test_config_dev: .ignore tests/full-mtracking/test_config: .ignore diff --git a/src/plugins/e-acsl/man/e-acsl-gcc.sh.1 b/src/plugins/e-acsl/man/e-acsl-gcc.sh.1 index c8e2e1fc53ed3c08144714f77f7c58eb4a2e3c6d..c8b71244e57cb02603ea5cc5931f7acfbb4e6d91 100644 --- a/src/plugins/e-acsl/man/e-acsl-gcc.sh.1 +++ b/src/plugins/e-acsl/man/e-acsl-gcc.sh.1 @@ -102,6 +102,9 @@ use the \fBFrama-C\fP standard library instead of a system-wide one. .B -M, --full-mtracking maximize memory-related instrumentation. .TP +.B --concurrency +enable concurrency support. +.TP .B --temporal enable checking for temporal memory errors in \\\fBvalid\fP and \\\fBvalid_read\fP predicates. .TP @@ -167,11 +170,14 @@ Valid arguments are: restrict annotations to a given list of functions. \fIOPTSTRING\fP is a comma-separated string comprising function names. .TP -.B --stack-size=\fI<NUMBER> -set the size (in MB) of the stack shadow space -.TP -.B --heap-size=\fI<NUMBER> -set the size (in MB) of the heap shadow space +.B --zone-sizes=\fI<NAME1:SIZE1,...,NAMEN:SIZEN> +set the size (in MB) of the given zones. + +Valid zone names are: + \fIstack\fP \- stack shadow space + \fIheap\fP \- heap shadow space + \fItls\fP \- TLS shadow space + \fIthread-stack\fP \- thread stack shadow space .TP .B -k, --keep-going continue execution after an assertion failure diff --git a/src/plugins/e-acsl/scripts/e-acsl-gcc.sh b/src/plugins/e-acsl/scripts/e-acsl-gcc.sh index dee1d9396e70fda6ffb80fc51e2f0d633e7ccf33..305398daa90f9c17a50a2d74d520a05501dd9b2d 100755 --- a/src/plugins/e-acsl/scripts/e-acsl-gcc.sh +++ b/src/plugins/e-acsl/scripts/e-acsl-gcc.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash ########################################################################## # # # This file is part of the Frama-C's E-ACSL plug-in. # @@ -127,6 +127,32 @@ is_number() { fi } +# Retrieve the zone size for a given zone name and limit +# - $1: the zone name +# - $2: the zone size +# - $3: the minimum zone size +# Return $2 if it is a positive number greater or equal than $3, otherwise +# return an error message with an error code of 1. +get_zone_size() { + local name="$1" + local n="$2" + local lim="$3" + + local zone_size="$(is_number "$n" $lim)" + case $zone_size in + '-') + echo "invalid number for $name: '$n'" + return 1 + ;; + '<') + echo "$name limit less than minimal size [$lim]" + return 1 + ;; + *) echo $zone_size + esac; + return 0 +} + # Split a comma-separated string into a space-separated string, remove # all duplicates and trailing, leading or multiple spaces tokenize() { @@ -267,6 +293,16 @@ mmodel_features() { flags="$flags -DE_ACSL_HEAP_SIZE=$OPTION_HEAP_SIZE" fi + # Set TLS shadow size + if [ -n "$OPTION_TLS_SIZE" ]; then + flags="$flags -DE_ACSL_TLS_SIZE=$OPTION_TLS_SIZE" + fi + + # Set thread stack size + if [ -n "$OPTION_THREAD_STACK_SIZE" ]; then + flags="$flags -DE_ACSL_THREAD_STACK_SIZE=$OPTION_THREAD_STACK_SIZE" + fi + # Set runtime verosity flags if [ -n "$OPTION_RT_VERBOSE" ]; then flags="$flags -DE_ACSL_VERBOSE -DE_ACSL_DEBUG_VERBOSE" @@ -310,13 +346,13 @@ check_getopt; LONGOPTIONS="help,compile,compile-only,debug:,ocode:,oexec:,verbose:, frama-c-only,extra-cpp-args:,frama-c-stdlib,full-mmodel,full-mtracking,gmp, quiet,logfile:,ld-flags:,cpp-flags:,frama-c-extra:,memory-model:,keep-going, - frama-c:,gcc:,e-acsl-share:,instrumented-only,rte:,oexec-e-acsl:, + frama-c:,gcc:,e-acsl-share:,instrumented-only,rte:,oexec-e-acsl:,concurrency, print-mmodels,rt-debug,rte-select:,then,e-acsl-extra:,check,fail-with-code:, - temporal,weak-validity,stack-size:,heap-size:,rt-verbose,free-valid-address, - external-assert:,assert-print-data,no-assert-print-data,external-print-value:, - validate-format-strings,no-trace,libc-replacements,with-dlmalloc:, - dlmalloc-from-sources,dlmalloc-compile-only,dlmalloc-compile-flags:, - odlmalloc:,ar:,ranlib:,mbits:" + temporal,weak-validity,stack-size:,heap-size:,zone-sizes:,rt-verbose, + free-valid-address,external-assert:,assert-print-data,no-assert-print-data, + external-print-value:,validate-format-strings,no-trace,libc-replacements, + with-dlmalloc:,dlmalloc-from-sources,dlmalloc-compile-only, + dlmalloc-compile-flags:,odlmalloc:,ar:,ranlib:,mbits:" SHORTOPTIONS="h,c,C,d:,D,o:,O:,v:,f,E:,L,M,l:,e:,g,q,s:,F:,m:,I:,G:,X,a:,T,k,V" # Prefix for an error message due to wrong arguments ERROR="ERROR parsing arguments:" @@ -342,7 +378,8 @@ OPTION_OUTPUT_EXEC="a.out" # Generated executable name OPTION_EACSL_OUTPUT_EXEC="" # Name of E-ACSL executable OPTION_EACSL="-e-acsl" # Specifies E-ACSL run OPTION_FRAMA_STDLIB="-no-frama-c-stdlib" # Use Frama-C stdlib -OPTION_FULL_MTRACKING= # Instrument as much as possible +OPTION_FULL_MTRACKING= # Instrument as much as possible +OPTION_CONCURRENCY= # Activate concurrency support OPTION_GMP= # Use GMP integers everywhere OPTION_EACSL_MMODELS="segment" # Memory model used OPTION_EACSL_SHARE= # Custom E-ACSL share directory @@ -361,6 +398,8 @@ OPTION_RTE_SELECT= # Generate assertions for these functions only OPTION_THEN= # Adds -then in front of -e-acsl in FC command. OPTION_STACK_SIZE= # Size of a heap shadow space (in MB) OPTION_HEAP_SIZE= # Size of a stack shadow space (in MB) +OPTIONS_TLS_SIZE= # Size of a TLS shadow space (in MB) +OPTIONS_THREAD_STACK_SIZE= # Size of a thread stack shadow space (in MB) OPTION_KEEP_GOING= # Report failing assertions but do not abort execution OPTION_EXTERNAL_ASSERT="" # Use custom definition of assert function OPTION_ASSERT_PRINT_DATA= # Print data contributing to a failed runtime assertion @@ -374,6 +413,8 @@ OPTION_OUTPUT_DLMALLOC="" # Name of the compiled dlmalloc SUPPORTED_MMODELS="bittree,segment" # Supported memory model names MIN_STACK=16 # Minimal size of a tracked program stack MIN_HEAP=64 # Minimal size of a tracked program heap +MIN_TLS=1 # Minimal size of a tracked program TLS +MIN_THREAD_STACK=4 # Minimal size of a tracked program thread stack manpage() { printf "e-acsl-gcc.sh - instrument and compile C files with E-ACSL @@ -553,6 +594,11 @@ do shift; OPTION_GMP="-e-acsl-gmp-only" ;; + # Concurrency support + --concurrency) + shift; + OPTION_CONCURRENCY="-e-acsl-concurrency" + ;; # Supply Frama-C executable name -I|--frama-c) shift; @@ -647,6 +693,8 @@ do ;; # Set heap shadow size --heap-size) + warning "--heap-size is a deprecated option." + warning "Please use --zone-sizes instead." shift; zone_size="$(is_number "$1" $MIN_HEAP)" case $zone_size in @@ -659,6 +707,8 @@ do ;; # Set stack shadow size --stack-size) + warning "--stack-size is a deprecated option." + warning "Please use --zone-sizes instead." shift; zone_size="$(is_number "$1" $MIN_STACK)" case $zone_size in @@ -668,6 +718,52 @@ do esac; shift; ;; + --zone-sizes) + shift; + zone_help_msg="available zone names for option --zone-sizes: + - stack + - heap + - tls + - thread-stack +The size is given in MB. +" + IFS=',' read -ra sizes <<< "$1" + for size in "${sizes[@]}"; do + IFS=':' read -ra size_arr <<< "$size" + if [ "${#size_arr[@]}" -eq "2" ]; then + zone_name="${size_arr[0]}" + zone_size="${size_arr[1]}" + case $zone_name in + stack) + OPTION_STACK_SIZE="$(get_zone_size $zone_name "$zone_size" $MIN_STACK)" + error "$OPTION_STACK_SIZE" $? + ;; + heap) + OPTION_HEAP_SIZE="$(get_zone_size $zone_name "$zone_size" $MIN_HEAP)" + error "$OPTION_HEAP_SIZE" $? + ;; + tls) + OPTION_TLS_SIZE="$(get_zone_size $zone_name "$zone_size" $MIN_TLS)" + error "$OPTION_TLS_SIZE" $? + ;; + thread-stack) + OPTION_THREAD_STACK_SIZE="$(get_zone_size $zone_name "$zone_size" $MIN_THREAD_STACK)" + error "$OPTION_THREAD_STACK_SIZE" $? + ;; + *) + error "invalid zone name: '$zone_name' +$zone_help_msg" + ;; + esac + elif [ "${#size_arr[@]}" -eq "1" ] && [ "${size_arr[0]}" == "help" ]; then + printf "e-acsl-gcc.sh - $zone_help_msg" + exit 1 + else + error "invalid zone size format: '$size' (expected 'name:number')" + fi + done + shift; + ;; # Custom runtime assert function --external-assert) shift; @@ -845,6 +941,12 @@ else OPT_LDFLAGS="" fi +# Concurrency support +if [ -n "$OPTION_CONCURRENCY" ]; then + OPT_CPPFLAGS="$OPT_CPPFLAGS -DE_ACSL_CONCURRENCY_PTHREAD" + OPT_LDFLAGS="$OPT_LDFLAGS -pthread" +fi + # Gcc and related flags CC="$OPTION_CC" CFLAGS="$OPTION_CFLAGS @@ -874,7 +976,8 @@ if [ "`basename $CC`" = 'clang' ]; then -Wno-incompatible-pointer-types-discards-qualifiers" fi -CPPFLAGS="$OPTION_CPPFLAGS" +CPPFLAGS="$OPTION_CPPFLAGS + $OPT_CPPFLAGS" LDFLAGS="$OPTION_LDFLAGS $OPT_LDFLAGS" @@ -926,6 +1029,8 @@ if [ "$OPTION_DLMALLOC_FROM_SOURCES" = "1" -o \ -DONLY_MSPACES \ -DMALLOC_ALIGNMENT=32 \ -DMSPACE_PREFIX=__e_acsl_ \ + -DUSE_LOCKS=1 \ + -DUSE_SPIN_LOCKS=1 \ $OPTION_DLMALLOC_COMPILE_FLAGS " @@ -992,6 +1097,7 @@ if [ -n "$OPTION_EACSL" ]; then $OPTION_DEBUG $OPTION_VALIDATE_FORMAT_STRINGS $OPTION_ASSERT_PRINT_DATA + $OPTION_CONCURRENCY -e-acsl-share="$EACSL_SHARE" -then-last" fi diff --git a/src/plugins/e-acsl/scripts/e-acsl-gcc.sh.comp b/src/plugins/e-acsl/scripts/e-acsl-gcc.sh.comp index da9457884607f8805c689f5633e00f9c72f0566f..face0dc29f108a243a102746c5cee249d4d5c4a2 100644 --- a/src/plugins/e-acsl/scripts/e-acsl-gcc.sh.comp +++ b/src/plugins/e-acsl/scripts/e-acsl-gcc.sh.comp @@ -41,7 +41,7 @@ _eacsl_gcc() { --gmp --full-mtracking --rte= --rte-select= --frama-c-stdlib --libc-replacements --temporal --free-valid-address --weak-validity --validate-format-strings - --heap-size --stack-size + --zone-sizes= --with-dlmalloc --dlmalloc-from-sources --dlmalloc-compile-only --dlmalloc-compile-flags --odlmalloc" diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_rtl.c b/src/plugins/e-acsl/share/e-acsl/e_acsl_rtl.c index a4941546ac2ea34d550efc6379c98d5007d3c518..1420b682afab6e797934335ff2b188b08cf0ff28 100644 --- a/src/plugins/e-acsl/share/e-acsl/e_acsl_rtl.c +++ b/src/plugins/e-acsl/share/e-acsl/e_acsl_rtl.c @@ -38,6 +38,7 @@ #include "internals/e_acsl_debug.c" #include "internals/e_acsl_malloc.c" #include "internals/e_acsl_private_assert.c" +#include "internals/e_acsl_rtl_error.c" #include "internals/e_acsl_rtl_io.c" #include "internals/e_acsl_rtl_string.c" #include "internals/e_acsl_shexec.c" diff --git a/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_assert.c b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_assert.c index b2b3ad1e9e32d6fd4295c068917d3ab7af7a1016..0d1158d3b7bf95f8f254905f500a2ec0ae883bd5 100644 --- a/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_assert.c +++ b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_assert.c @@ -50,6 +50,7 @@ void eacsl_print_values(eacsl_assert_data_t *data) { void eacsl_runtime_assert(int predicate, eacsl_assert_data_t *data) { if (eacsl_runtime_sound_verdict) { if (!predicate) { + RTL_IO_LOCK(); // clang-format off STDERR("%s: In function '%s'\n" "%s:%d: Error: %s failed:\n" @@ -60,6 +61,7 @@ void eacsl_runtime_assert(int predicate, eacsl_assert_data_t *data) { data->pred_txt); // clang-format on eacsl_print_values(data); + RTL_IO_UNLOCK(); if (data->blocking) { # ifndef E_ACSL_NO_ASSERT_FAIL /* Do fail on assertions */ # ifdef E_ACSL_FAIL_EXITCODE /* Fail by exit with a given code */ @@ -72,6 +74,7 @@ void eacsl_runtime_assert(int predicate, eacsl_assert_data_t *data) { } # ifdef E_ACSL_DEBUG_ASSERT else { + RTL_IO_LOCK(); // clang-format off STDERR("%s: In function '%s'\n" "%s:%d: %s valid:\n" @@ -81,9 +84,11 @@ void eacsl_runtime_assert(int predicate, eacsl_assert_data_t *data) { data->pred_txt); // clang-format on eacsl_print_values(data); + RTL_IO_UNLOCK(); } # endif } else { + RTL_IO_LOCK(); // clang-format off STDERR("%s: In function '%s'\n" "%s:%d: Warning: no sound verdict for %s (guess: %s).\n" @@ -94,6 +99,7 @@ void eacsl_runtime_assert(int predicate, eacsl_assert_data_t *data) { data->pred_txt); // clang-format on eacsl_print_values(data); + RTL_IO_UNLOCK(); } } #endif diff --git a/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal_timestamp.h b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal_timestamp.h index de1761e09ab374effee400f4822b80c1ce1a3e90..b0c1842e45722e1d58fdd540260d9667732e00ee 100644 --- a/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal_timestamp.h +++ b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal_timestamp.h @@ -63,8 +63,12 @@ typedef struct temporal_parameter temporal_parameter; /*! \brief External array used to transfer parameters from one function * to another. * - * WARNING! NOT thread-safe! A better way would probably have it as - * __thread so it is local to every thread. */ + * WARNING! NOT thread-safe! First these global variables are not protected from + * concurrent accesses. Second the temporal system stores parameters before + * calling a function and pulls them inside the function. This is completely + * incompatible with a concurrent call since the parameters will be stored on + * one thread and pulled from another thread some later time, maybe after other + * synchronous calls. */ static temporal_parameter parameter_referents[MAX_PARAMETERS]; static uint32_t return_referent; diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_concurrency.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_concurrency.h new file mode 100644 index 0000000000000000000000000000000000000000..4961dd4466d715e5b50fd8c8ddbb843d56773d44 --- /dev/null +++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_concurrency.h @@ -0,0 +1,158 @@ +/**************************************************************************/ +/* */ +/* This file is part of the Frama-C's E-ACSL plug-in. */ +/* */ +/* Copyright (C) 2012-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/**************************************************************************/ + +/*! *********************************************************************** + * \file + * \brief E-ACSL concurrency utility macros and functions. + **************************************************************************/ + +#ifndef E_ACSL_CONCURRENCY +#define E_ACSL_CONCURRENCY + +#ifdef E_ACSL_CONCURRENCY_PTHREAD +# include <pthread.h> +# include <string.h> + +# include "e_acsl_debug.h" +# include "e_acsl_rtl_error.h" + +/************************************************************************/ +/*** Run once function {{{ ***/ +/************************************************************************/ + +# ifdef E_ACSL_DEBUG +/*! \brief Buffer to hold a thread-specific error message. + + This buffer and `rtl_strerror_t()` are used instead of directly + `rtl_strerror()` because since `E_ACSL_RUN_ONCE` is called when processing + logging functions, the message returned by `rtl_strerror()` in a + `DVASSERT()` call could be overwritten. */ +static __thread char __e_acsl_run_once_error_buffer[255]; +# endif + +/*! \brief The first call to `E_ACSL_RUN_ONCE` will call the initialization + function `init_fct()` without arguments. Any subsequent call to + `E_ACSL_RUN_ONCE` will not call `init_fct()`. After calling + `E_ACSL_RUN_ONCE`, the function `init_fct()` has been called. */ +# define E_ACSL_RUN_ONCE(init_fct) \ + do { \ + static pthread_once_t already_run = PTHREAD_ONCE_INIT; \ + int result = pthread_once(&already_run, init_fct); \ + DVASSERT(result == 0, \ + "Unable to initialize with function '" #init_fct "()': %s\n", \ + rtl_strerror_r(errno, __e_acsl_run_once_error_buffer, \ + sizeof(__e_acsl_run_once_error_buffer))); \ + } while (0) + +/*! \brief The first call to `E_ACSL_RUN_ONCE_WITH_ARGS` will call the + initialization function `init_fct()` with arguments `args...`. Any + subsequent call to `E_ACSL_RUN_ONCE_WITH_ARGS` will not call `init_fct()`. + After calling `E_ACSL_RUN_ONCE_WITH_ARGS`, the function `init_fct()` has + been called. */ +# define E_ACSL_RUN_ONCE_WITH_ARGS(init_fct, args...) \ + do { \ + static int already_run = 0; \ + static pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER; \ + pthread_rwlock_rdlock(&rwlock); \ + if (!already_run) { \ + pthread_rwlock_unlock(&rwlock); \ + pthread_rwlock_wrlock(&rwlock); \ + if (!already_run) { \ + init_fct(args); \ + already_run = 1; \ + } \ + } \ + pthread_rwlock_unlock(&rwlock); \ + } while (0) + +/* }}} */ + +/************************************************************************/ +/*** Mutex {{{ ***/ +/************************************************************************/ + +/*! \brief Declare a static mutex variable named `mutex` with the initialization + `init`. */ +# define E_ACSL_MUTEX_DECL_INIT(mutex, init) \ + static pthread_mutex_t mutex = init + +/*! \brief Lock the given mutex */ +# define E_ACSL_MUTEX_LOCK(mutex) pthread_mutex_lock(&(mutex)) + +/*! \brief Unlock the given mutex */ +# define E_ACSL_MUTEX_UNLOCK(mutex) pthread_mutex_unlock(&(mutex)) + +/* }}} */ + +/************************************************************************/ +/*** Read-write lock {{{ ***/ +/************************************************************************/ + +/*! \brief Declare a read-write lock variable named `rwlock`. */ +# define E_ACSL_RWLOCK_DECL(rwlock) pthread_rwlock_t rwlock + +/*! \brief Initialize the given read-write lock with the given attributes. */ +# define E_ACSL_RWINIT(rwlock, attrs) pthread_rwlock_init(&(rwlock), attrs) + +/*! \brief Destroy the given read-write lock. */ +# define E_ACSL_RWDESTROY(rwlock) pthread_rwlock_destroy(&(rwlock)) + +/*! \brief Apply a read lock to the given read-write lock. */ +# define E_ACSL_RLOCK(rwlock) \ + pthread_rwlock_rdlock((pthread_rwlock_t *)&(rwlock)) + +/*! \brief Apply a write lock to the given read-write lock. */ +# define E_ACSL_WLOCK(rwlock) pthread_rwlock_wrlock(&(rwlock)) + +/*! \brief Unlock the given read-write lock. */ +# define E_ACSL_RWUNLOCK(rwlock) \ + pthread_rwlock_unlock((pthread_rwlock_t *)&(rwlock)) + +/* }}} */ + +#else + +# define E_ACSL_RUN_ONCE_WITH_ARGS(init_fct, args...) \ + do { \ + static int already_run = 0; \ + if (!already_run) { \ + init_fct(args); \ + already_run = 1; \ + } \ + } while (0) + +# define E_ACSL_RUN_ONCE(init_fct) E_ACSL_RUN_ONCE_WITH_ARGS(init_fct) + +# define E_ACSL_MUTEX_DECL_INIT(mutex, init) +# define E_ACSL_MUTEX_LOCK(mutex) +# define E_ACSL_MUTEX_UNLOCK(mutex) + +# define E_ACSL_RWLOCK_DECL(rwlock) +# define E_ACSL_RWINIT(rwlock, attrs) +# define E_ACSL_RWDESTROY(rwlock) +# define E_ACSL_RLOCK(rwlock) +# define E_ACSL_WLOCK(rwlock) +# define E_ACSL_RWUNLOCK(rwlock) + +#endif + +#endif // E_ACSL_CONCURRENCY diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_debug.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_debug.c index 9e7ee446a82f4d967a23582680655b6180c4a143..15ce0534410b77b8e6d1243729782df88712682c 100644 --- a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_debug.c +++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_debug.c @@ -88,6 +88,7 @@ void initialize_report_file(int *argc, char ***argv) { void describe_run() { #if defined(E_ACSL_VERBOSE) + RTL_IO_LOCK(); rtl_printf( "/* ========================================================= */\n"); rtl_printf(" * E-ACSL instrumented run\n"); @@ -99,5 +100,6 @@ void describe_run() { rtl_printf(" * Format Checks: %s\n", E_ACSL_FORMAT_VALIDITY_DESC); rtl_printf( "/* ========================================================= */\n"); + RTL_IO_UNLOCK(); #endif } diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.c index 984c884ee94e12e6342ae260c6702994fed42d44..b2d2c5fbd2c80412164ffacfd7a4ca3bc839ed05 100644 --- a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.c +++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.c @@ -22,6 +22,10 @@ #include "e_acsl_malloc.h" +#define eacsl_create_mspace export_alias(create_mspace) + +extern mspace eacsl_create_mspace(size_t, int); + struct memory_spaces mem_spaces = { .rtl_mspace = NULL, .heap_mspace = NULL, @@ -32,12 +36,16 @@ struct memory_spaces mem_spaces = { .heap_mspace_least = 0, }; +mspace eacsl_create_locked_mspace(size_t size) { + return eacsl_create_mspace(size, 1); +} + /* \brief Create two memory spaces, one for RTL and the other for application memory. This function *SHOULD* be called before any allocations are made otherwise execution fails */ void eacsl_make_memory_spaces(size_t rtl_size, size_t heap_size) { - mem_spaces.rtl_mspace = eacsl_create_mspace(rtl_size, 0); - mem_spaces.heap_mspace = eacsl_create_mspace(heap_size, 0); + mem_spaces.rtl_mspace = eacsl_create_locked_mspace(rtl_size); + mem_spaces.heap_mspace = eacsl_create_locked_mspace(heap_size); /* Do not use `eacsl_mspace_least_addr` here, as it returns the address of the mspace header. */ mem_spaces.rtl_start = diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.h index 83cd59e275e133e57ef7a65cc949124f060f5c3f..57505489d1d105bbf665dce92e122160f7d2b964 100644 --- a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.h +++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.h @@ -28,7 +28,7 @@ * is split into two mspaces (memory spaces). Memory allocation itself is * delegated to a slightly customised version of dlmalloc shipped with the * RTL. The overall pattern is as follows: - * mspace space = eacsl_create_mspace(capacity, locks); + * mspace space = eacsl_create_locked_mspace(capacity); * char *p = eacsl_mspace_malloc(space, size); **************************************************************************/ @@ -70,7 +70,7 @@ void eacsl_destroy_memory_spaces(); /*** Mspace allocators (from dlmalloc) {{{ ***/ /************************************************************************/ -#define eacsl_create_mspace export_alias(create_mspace) +#define eacsl_create_locked_mspace export_alias(create_locked_mspace) #define eacsl_destroy_mspace export_alias(destroy_mspace) #define eacsl_mspace_least_addr export_alias(mspace_least_addr) #define eacsl_mspace_malloc export_alias(mspace_malloc) @@ -93,7 +93,7 @@ struct memory_spaces { }; extern struct memory_spaces mem_spaces; -extern mspace eacsl_create_mspace(size_t, int); +/* Original functions from dlmalloc */ extern size_t eacsl_destroy_mspace(mspace); extern void *eacsl_mspace_malloc(mspace, size_t); extern void eacsl_mspace_free(mspace, void *); @@ -103,6 +103,10 @@ extern void *eacsl_mspace_aligned_alloc(mspace, size_t, size_t); extern int eacsl_mspace_posix_memalign(mspace, void **, size_t, size_t); extern void *eacsl_mspace_least_addr(mspace); +/*! \brief Wrapper around `eacsl_create_mspace` to always create a thread-safe + * mspace. */ +mspace eacsl_create_locked_mspace(size_t size); + /* }}} */ /************************************************************************/ diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_private_assert.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_private_assert.c index 40da9b3985bfc243ed486b7621fccdb1bff8f087..b4ca88e1fe53d47bd84ed749d302dbd60d13e144 100644 --- a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_private_assert.c +++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_private_assert.c @@ -31,14 +31,6 @@ #include "e_acsl_private_assert.h" -#define prepend_file_line(file, line, fmt) \ - do { \ - char *afmt = "%s:%d: %s\n"; \ - char buf[strlen(fmt) + strlen(afmt) + PATH_MAX + 11]; \ - rtl_sprintf(buf, afmt, file, line, fmt); \ - fmt = buf; \ - } while (0) - void raise_abort(const char *file, int line) { #ifdef E_ACSL_DEBUG # ifndef E_ACSL_NO_TRACE @@ -69,7 +61,7 @@ void private_assert_fail(int expr, const char *file, int line, char *fmt, ...) { if (!expr) { char *afmt = "%s:%d: %s"; char buf[strlen(fmt) + strlen(afmt) + PATH_MAX + 11]; - rtl_sprintf(buf, afmt, file, line, fmt); + rtl_snprintf(buf, sizeof(buf), afmt, file, line, fmt); fmt = buf; va_list va; diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_error.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_error.c new file mode 100644 index 0000000000000000000000000000000000000000..a0fb18fc2c3dce5cc1fc37aec7e42f4584ce0d33 --- /dev/null +++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_error.c @@ -0,0 +1,606 @@ +/**************************************************************************/ +/* */ +/* This file is part of the Frama-C's E-ACSL plug-in. */ +/* */ +/* Copyright (C) 2012-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/**************************************************************************/ + +/*! *********************************************************************** + * \file + * \brief Provide malloc-free replacements for some error formatting + * functions. + **************************************************************************/ + +#include <errno.h> + +#include "e_acsl_rtl_io.h" + +#include "e_acsl_rtl_error.h" + +/*! This array contains all known error messages of the glibc. The messages are + taken from the `errno -l` command from the `moreutils` package. + We needed to retrieve and store these error messages because the glibc array + `sys_errlist` will either not be present or not contain every error message. +*/ +static const char *const RTL_SYS_ERRORLIST[] = { + [0] = "Success", + +#ifdef EPERM + [EPERM] = "Operation not permitted", +#endif + +#ifdef ENOENT + [ENOENT] = "No such file or directory", +#endif + +#ifdef ESRCH + [ESRCH] = "No such process", +#endif + +#ifdef EINTR + [EINTR] = "Interrupted system call", +#endif + +#ifdef EIO + [EIO] = "Input/output error", +#endif + +#ifdef ENXIO + [ENXIO] = "No such device or address", +#endif + +#ifdef E2BIG + [E2BIG] = "Argument list too long", +#endif + +#ifdef ENOEXEC + [ENOEXEC] = "Exec format error", +#endif + +#ifdef EBADF + [EBADF] = "Bad file descriptor", +#endif + +#ifdef ECHILD + [ECHILD] = "No child processes", +#endif + +#ifdef EAGAIN + [EAGAIN] = "Resource temporarily unavailable", +#endif + +#ifdef ENOMEM + [ENOMEM] = "Cannot allocate memory", +#endif + +#ifdef EACCES + [EACCES] = "Permission denied", +#endif + +#ifdef EFAULT + [EFAULT] = "Bad address", +#endif + +#ifdef ENOTBLK + [ENOTBLK] = "Block device required", +#endif + +#ifdef EBUSY + [EBUSY] = "Device or resource busy", +#endif + +#ifdef EEXIST + [EEXIST] = "File exists", +#endif + +#ifdef EXDEV + [EXDEV] = "Invalid cross-device link", +#endif + +#ifdef ENODEV + [ENODEV] = "No such device", +#endif + +#ifdef ENOTDIR + [ENOTDIR] = "Not a directory", +#endif + +#ifdef EISDIR + [EISDIR] = "Is a directory", +#endif + +#ifdef EINVAL + [EINVAL] = "Invalid argument", +#endif + +#ifdef ENFILE + [ENFILE] = "Too many open files in system", +#endif + +#ifdef EMFILE + [EMFILE] = "Too many open files", +#endif + +#ifdef ENOTTY + [ENOTTY] = "Inappropriate ioctl for device", +#endif + +#ifdef ETXTBSY + [ETXTBSY] = "Text file busy", +#endif + +#ifdef EFBIG + [EFBIG] = "File too large", +#endif + +#ifdef ENOSPC + [ENOSPC] = "No space left on device", +#endif + +#ifdef ESPIPE + [ESPIPE] = "Illegal seek", +#endif + +#ifdef EROFS + [EROFS] = "Read-only file system", +#endif + +#ifdef EMLINK + [EMLINK] = "Too many links", +#endif + +#ifdef EPIPE + [EPIPE] = "Broken pipe", +#endif + +#ifdef EDOM + [EDOM] = "Numerical argument out of domain", +#endif + +#ifdef ERANGE + [ERANGE] = "Numerical result out of range", +#endif + +#ifdef EDEADLK + [EDEADLK] = "Resource deadlock avoided", +#endif + +#ifdef ENAMETOOLONG + [ENAMETOOLONG] = "File name too long", +#endif + +#ifdef ENOLCK + [ENOLCK] = "No locks available", +#endif + +#ifdef ENOSYS + [ENOSYS] = "Function not implemented", +#endif + +#ifdef ENOTEMPTY + [ENOTEMPTY] = "Directory not empty", +#endif + +#ifdef ELOOP + [ELOOP] = "Too many levels of symbolic links", +#endif + +#ifdef EWOULDBLOCK + [EWOULDBLOCK] = "Resource temporarily unavailable", +#endif + +#ifdef ENOMSG + [ENOMSG] = "No message of desired type", +#endif + +#ifdef EIDRM + [EIDRM] = "Identifier removed", +#endif + +#ifdef ECHRNG + [ECHRNG] = "Channel number out of range", +#endif + +#ifdef EL2NSYNC + [EL2NSYNC] = "Level 2 not synchronized", +#endif + +#ifdef EL3HLT + [EL3HLT] = "Level 3 halted", +#endif + +#ifdef EL3RST + [EL3RST] = "Level 3 reset", +#endif + +#ifdef ELNRNG + [ELNRNG] = "Link number out of range", +#endif + +#ifdef EUNATCH + [EUNATCH] = "Protocol driver not attached", +#endif + +#ifdef ENOCSI + [ENOCSI] = "No CSI structure available", +#endif + +#ifdef EL2HLT + [EL2HLT] = "Level 2 halted", +#endif + +#ifdef EBADE + [EBADE] = "Invalid exchange", +#endif + +#ifdef EBADR + [EBADR] = "Invalid request descriptor", +#endif + +#ifdef EXFULL + [EXFULL] = "Exchange full", +#endif + +#ifdef ENOANO + [ENOANO] = "No anode", +#endif + +#ifdef EBADRQC + [EBADRQC] = "Invalid request code", +#endif + +#ifdef EBADSLT + [EBADSLT] = "Invalid slot", +#endif + +#ifdef EDEADLOCK + [EDEADLOCK] = "Resource deadlock avoided", +#endif + +#ifdef EBFONT + [EBFONT] = "Bad font file format", +#endif + +#ifdef ENOSTR + [ENOSTR] = "Device not a stream", +#endif + +#ifdef ENODATA + [ENODATA] = "No data available", +#endif + +#ifdef ETIME + [ETIME] = "Timer expired", +#endif + +#ifdef ENOSR + [ENOSR] = "Out of streams resources", +#endif + +#ifdef ENONET + [ENONET] = "Machine is not on the network", +#endif + +#ifdef ENOPKG + [ENOPKG] = "Package not installed", +#endif + +#ifdef EREMOTE + [EREMOTE] = "Object is remote", +#endif + +#ifdef ENOLINK + [ENOLINK] = "Link has been severed", +#endif + +#ifdef EADV + [EADV] = "Advertise error", +#endif + +#ifdef ESRMNT + [ESRMNT] = "Srmount error", +#endif + +#ifdef ECOMM + [ECOMM] = "Communication error on send", +#endif + +#ifdef EPROTO + [EPROTO] = "Protocol error", +#endif + +#ifdef EMULTIHOP + [EMULTIHOP] = "Multihop attempted", +#endif + +#ifdef EDOTDOT + [EDOTDOT] = "RFS specific error", +#endif + +#ifdef EBADMSG + [EBADMSG] = "Bad message", +#endif + +#ifdef EOVERFLOW + [EOVERFLOW] = "Value too large for defined data type", +#endif + +#ifdef ENOTUNIQ + [ENOTUNIQ] = "Name not unique on network", +#endif + +#ifdef EBADFD + [EBADFD] = "File descriptor in bad state", +#endif + +#ifdef EREMCHG + [EREMCHG] = "Remote address changed", +#endif + +#ifdef ELIBACC + [ELIBACC] = "Can not access a needed shared library", +#endif + +#ifdef ELIBBAD + [ELIBBAD] = "Accessing a corrupted shared library", +#endif + +#ifdef ELIBSCN + [ELIBSCN] = ".lib section in a.out corrupted", +#endif + +#ifdef ELIBMAX + [ELIBMAX] = "Attempting to link in too many shared libraries", +#endif + +#ifdef ELIBEXEC + [ELIBEXEC] = "Cannot exec a shared library directly", +#endif + +#ifdef EILSEQ + [EILSEQ] = "Invalid or incomplete multibyte or wide character", +#endif + +#ifdef ERESTART + [ERESTART] = "Interrupted system call should be restarted", +#endif + +#ifdef ESTRPIPE + [ESTRPIPE] = "Streams pipe error", +#endif + +#ifdef EUSERS + [EUSERS] = "Too many users", +#endif + +#ifdef ENOTSOCK + [ENOTSOCK] = "Socket operation on non-socket", +#endif + +#ifdef EDESTADDRREQ + [EDESTADDRREQ] = "Destination address required", +#endif + +#ifdef EMSGSIZE + [EMSGSIZE] = "Message too long", +#endif + +#ifdef EPROTOTYPE + [EPROTOTYPE] = "Protocol wrong type for socket", +#endif + +#ifdef ENOPROTOOPT + [ENOPROTOOPT] = "Protocol not available", +#endif + +#ifdef EPROTONOSUPPORT + [EPROTONOSUPPORT] = "Protocol not supported", +#endif + +#ifdef ESOCKTNOSUPPORT + [ESOCKTNOSUPPORT] = "Socket type not supported", +#endif + +#ifdef EOPNOTSUPP + [EOPNOTSUPP] = "Operation not supported", +#endif + +#ifdef EPFNOSUPPORT + [EPFNOSUPPORT] = "Protocol family not supported", +#endif + +#ifdef EAFNOSUPPORT + [EAFNOSUPPORT] = "Address family not supported by protocol", +#endif + +#ifdef EADDRINUSE + [EADDRINUSE] = "Address already in use", +#endif + +#ifdef EADDRNOTAVAIL + [EADDRNOTAVAIL] = "Cannot assign requested address", +#endif + +#ifdef ENETDOWN + [ENETDOWN] = "Network is down", +#endif + +#ifdef ENETUNREACH + [ENETUNREACH] = "Network is unreachable", +#endif + +#ifdef ENETRESET + [ENETRESET] = "Network dropped connection on reset", +#endif + +#ifdef ECONNABORTED + [ECONNABORTED] = "Software caused connection abort", +#endif + +#ifdef ECONNRESET + [ECONNRESET] = "Connection reset by peer", +#endif + +#ifdef ENOBUFS + [ENOBUFS] = "No buffer space available", +#endif + +#ifdef EISCONN + [EISCONN] = "Transport endpoint is already connected", +#endif + +#ifdef ENOTCONN + [ENOTCONN] = "Transport endpoint is not connected", +#endif + +#ifdef ESHUTDOWN + [ESHUTDOWN] = "Cannot send after transport endpoint shutdown", +#endif + +#ifdef ETOOMANYREFS + [ETOOMANYREFS] = "Too many references: cannot splice", +#endif + +#ifdef ETIMEDOUT + [ETIMEDOUT] = "Connection timed out", +#endif + +#ifdef ECONNREFUSED + [ECONNREFUSED] = "Connection refused", +#endif + +#ifdef EHOSTDOWN + [EHOSTDOWN] = "Host is down", +#endif + +#ifdef EHOSTUNREACH + [EHOSTUNREACH] = "No route to host", +#endif + +#ifdef EALREADY + [EALREADY] = "Operation already in progress", +#endif + +#ifdef EINPROGRESS + [EINPROGRESS] = "Operation now in progress", +#endif + +#ifdef ESTALE + [ESTALE] = "Stale file handle", +#endif + +#ifdef EUCLEAN + [EUCLEAN] = "Structure needs cleaning", +#endif + +#ifdef ENOTNAM + [ENOTNAM] = "Not a XENIX named type file", +#endif + +#ifdef ENAVAIL + [ENAVAIL] = "No XENIX semaphores available", +#endif + +#ifdef EISNAM + [EISNAM] = "Is a named type file", +#endif + +#ifdef EREMOTEIO + [EREMOTEIO] = "Remote I/O error", +#endif + +#ifdef EDQUOT + [EDQUOT] = "Disk quota exceeded", +#endif + +#ifdef ENOMEDIUM + [ENOMEDIUM] = "No medium found", +#endif + +#ifdef EMEDIUMTYPE + [EMEDIUMTYPE] = "Wrong medium type", +#endif + +#ifdef ECANCELED + [ECANCELED] = "Operation canceled", +#endif + +#ifdef ENOKEY + [ENOKEY] = "Required key not available", +#endif + +#ifdef EKEYEXPIRED + [EKEYEXPIRED] = "Key has expired", +#endif + +#ifdef EKEYREVOKED + [EKEYREVOKED] = "Key has been revoked", +#endif + +#ifdef EKEYREJECTED + [EKEYREJECTED] = "Key was rejected by service", +#endif + +#ifdef EOWNERDEAD + [EOWNERDEAD] = "Owner died", +#endif + +#ifdef ENOTRECOVERABLE + [ENOTRECOVERABLE] = "State not recoverable", +#endif + +#ifdef ERFKILL + [ERFKILL] = "Operation not possible due to RF-kill", +#endif + +#ifdef EHWPOISON + [EHWPOISON] = "Memory page has hardware error", +#endif + +#ifdef ENOTSUP + [ENOTSUP] = "Operation not supported", +#endif +}; + +/*! Number of elements in RTL_SYS_ERRORLIST. */ +static const int RTL_SYS_NERR = + sizeof(RTL_SYS_ERRORLIST) / sizeof(RTL_SYS_ERRORLIST[0]); + +/*! Formatting string for an unknown error. */ +#define RTL_UNKNOWN_ERROR "Unknown error: %d\n" + +char *rtl_strerror(int errnum) { + if (errnum >= 0 && errnum < RTL_SYS_NERR + && RTL_SYS_ERRORLIST[errnum] != NULL) { + return (char *)RTL_SYS_ERRORLIST[errnum]; + } else { + static __thread char buf[sizeof(RTL_UNKNOWN_ERROR) + 21]; + rtl_snprintf(buf, sizeof(buf), RTL_UNKNOWN_ERROR, errnum); + return buf; + } +} + +char *rtl_strerror_r(int errnum, char *buf, size_t bufsize) { + if (errnum >= 0 && errnum < RTL_SYS_NERR + && RTL_SYS_ERRORLIST[errnum] != NULL) { + rtl_snprintf(buf, bufsize, "%s", RTL_SYS_ERRORLIST[errnum]); + } else { + rtl_snprintf(buf, bufsize, RTL_UNKNOWN_ERROR, errnum); + } + return buf; +} diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_error.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_error.h new file mode 100644 index 0000000000000000000000000000000000000000..5d76e692216adecea34b4beac4485b502e615c07 --- /dev/null +++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_error.h @@ -0,0 +1,43 @@ +/**************************************************************************/ +/* */ +/* This file is part of the Frama-C's E-ACSL plug-in. */ +/* */ +/* Copyright (C) 2012-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/**************************************************************************/ + +/*! *********************************************************************** + * \file + * \brief Provide malloc-free replacements for some error formatting + * functions. + **************************************************************************/ + +#ifndef E_ACSL_RTL_ERROR +#define E_ACSL_RTL_ERROR + +#include <errno.h> + +/*! \brief `strerror()` replacement without dynamic allocation. */ +char *rtl_strerror(int errnum); + +/*! \brief `strerror_r()` replacement without dynamic allocation. + + The error message will be copied into `buf` up to `bufsize`. The address of + the buffer is also returned by the function. */ +char *rtl_strerror_r(int errnum, char *buf, size_t bufsize); + +#endif // E_ACSL_RTL_ERROR diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.c index 6bcc5370058d07296866fdfe13497c6b01317525..78989ecd12876e84632f2780ba495a45a5eb109b 100644 --- a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.c +++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.c @@ -45,9 +45,46 @@ #include <stdint.h> #include <unistd.h> +#include "e_acsl_concurrency.h" #include "e_acsl_rtl_io.h" -typedef void (*putcf)(void *, char); +/*! \brief Test if we can still write `n + 1` characters to the buffer according + to the `count` variable. */ +#define TEST_COUNT_N(count, n) ((count) == NULL || *(count) > (n)) + +/*! \brief Test if we can still write a character to the buffer according to + the `count` variable. */ +#define TEST_COUNT(count) TEST_COUNT_N(count, 0) + +/*! \brief Decrease the value of `*count` by `n` if `count` is not `NULL`. */ +#define DEC_COUNT_N(count, n) \ + do { \ + if ((count) != NULL) { \ + *(count) -= (n); \ + } \ + } while (0) + +/*! \brief Decrease the value of `*count` by 1 if `count` is not `NULL`. */ +#define DEC_COUNT(count) DEC_COUNT_N(count, 1) + +typedef void (*putcf)(void *, size_t *, char); + +#ifdef E_ACSL_CONCURRENCY_PTHREAD +static pthread_mutex_t rtl_io_global_mutex_value; + +static void rtl_io_initialize_global_mutex() { + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&rtl_io_global_mutex_value, &attr); + pthread_mutexattr_destroy(&attr); +} + +pthread_mutex_t *rtl_io_global_mutex() { + E_ACSL_RUN_ONCE(rtl_io_initialize_global_mutex); + return &rtl_io_global_mutex_value; +} +#endif /* Unsigned long integers to string conversion (%u) */ static void uli2a(unsigned long int num, unsigned int base, int uc, char *bf) { @@ -209,28 +246,43 @@ static char a2i(char ch, char **src, int base, int *nump) { return ch; } -static void putchw(void *putp, putcf putf, int n, char z, char *bf) { +static void putchw(void *putp, size_t *count, putcf putf, int n, char z, + char *bf) { char fc = z ? '0' : ' '; char ch; char *p = bf; while (*p++ && n > 0) n--; while (n-- > 0) - putf(putp, fc); + putf(putp, count, fc); while ((ch = *bf++)) - putf(putp, ch); + putf(putp, count, ch); } -static void putcp(void *p, char c) { - *(*((char **)p))++ = c; +static void putcp(void *p, size_t *count, char c) { + if (TEST_COUNT(count)) { + *(*((char **)p))++ = c; + DEC_COUNT(count); + } } -static void _format(void *putp, putcf putf, char *fmt, va_list va) { +/** Load the data from the format string `fmt` and the variadic arguments `va`, + * convert them to character string equivalents and write the result to the + * stream `putp` with the function `putf` up to `count` characters. + * \param putp Pointer to a stream where the formatted string will be outputted. + * \param count Pointer to an integer representing the number of characters that + * can still be written to `putp`, or `NULL` if there are no limits. + * \param putf Function pointer to write a character to a given stream. + * \param fmt Formatting string. + * \param va Arguments for the formatting string. + */ +static void _format(void *putp, size_t *count, putcf putf, char *fmt, + va_list va) { char bf[256]; char ch; - while ((ch = *(fmt++))) { + while ((ch = *(fmt++)) && TEST_COUNT(count)) { if (ch != '%') // if not '%' print character as is - putf(putp, ch); + putf(putp, count, ch); else { // otherwise do the print based on the format following '%' char lz = 0; char lng = 0; // long (i.e., 'l' specifier) @@ -255,7 +307,7 @@ static void _format(void *putp, putcf putf, char *fmt, va_list va) { uli2a(va_arg(va, unsigned long int), 10, 0, bf); else ui2a(va_arg(va, unsigned int), 10, 0, bf); - putchw(putp, putf, w, lz, bf); + putchw(putp, count, putf, w, lz, bf); break; } case 'd': { @@ -263,32 +315,32 @@ static void _format(void *putp, putcf putf, char *fmt, va_list va) { li2a(va_arg(va, unsigned long int), bf); else i2a(va_arg(va, int), bf); - putchw(putp, putf, w, lz, bf); + putchw(putp, count, putf, w, lz, bf); break; } case 'p': ptr2a(va_arg(va, void *), bf); - putchw(putp, putf, w, lz, bf); + putchw(putp, count, putf, w, lz, bf); break; case 'a': addr2a(va_arg(va, uintptr_t), bf); - putchw(putp, putf, w, lz, bf); + putchw(putp, count, putf, w, lz, bf); break; case 'b': bits2a(va_arg(va, long), w > 64 ? 64 : w ? w : 8, bf, 1); - putchw(putp, putf, 0, 0, bf); + putchw(putp, count, putf, 0, 0, bf); break; case 'B': bits2a(va_arg(va, long), w > 64 ? 64 : w ? w : 8, bf, 0); - putchw(putp, putf, 0, 0, bf); + putchw(putp, count, putf, 0, 0, bf); break; case 'v': pbits2a(va_arg(va, void *), w ? w : 8, bf, 1); - putchw(putp, putf, 0, 0, bf); + putchw(putp, count, putf, 0, 0, bf); break; case 'V': pbits2a(va_arg(va, void *), w ? w : 8, bf, 0); - putchw(putp, putf, 0, 0, bf); + putchw(putp, count, putf, 0, 0, bf); break; case 'x': case 'X': @@ -296,29 +348,29 @@ static void _format(void *putp, putcf putf, char *fmt, va_list va) { uli2a(va_arg(va, unsigned long int), 16, (ch == 'X'), bf); else ui2a(va_arg(va, unsigned int), 16, (ch == 'X'), bf); - putchw(putp, putf, w, lz, bf); + putchw(putp, count, putf, w, lz, bf); break; case 'f': { double num = va_arg(va, double); int ord = (int)num; i2a(ord, bf); - putchw(putp, putf, w, lz, bf); - putf(putp, '.'); + putchw(putp, count, putf, w, lz, bf); + putf(putp, count, '.'); num = num - ord; num *= 1000; ord = (int)num; i2a(ord, bf); - putchw(putp, putf, w, lz, bf); + putchw(putp, count, putf, w, lz, bf); break; } case 'c': - putf(putp, (char)(va_arg(va, int))); + putf(putp, count, (char)(va_arg(va, int))); break; case 's': - putchw(putp, putf, w, 0, va_arg(va, char *)); + putchw(putp, count, putf, w, 0, va_arg(va, char *)); break; case '%': - putf(putp, ch); + putf(putp, count, ch); default: break; } @@ -326,41 +378,58 @@ static void _format(void *putp, putcf putf, char *fmt, va_list va) { } } -static void _charc_stdout(void *p, char c) { - write(STDOUT_FILENO, &c, 1); +static void _charc_stdout(void *p, size_t *count, char c) { + if (TEST_COUNT(count)) { + write(STDOUT_FILENO, &c, 1); + DEC_COUNT(count); + } } -static void _charc_stderr(void *p, char c) { - write(STDERR_FILENO, &c, 1); +static void _charc_stderr(void *p, size_t *count, char c) { + if (TEST_COUNT(count)) { + write(STDERR_FILENO, &c, 1); + DEC_COUNT(count); + } } -static void _charc_file(void *p, char c) { - write((size_t)p, &c, 1); +static void _charc_file(void *p, size_t *count, char c) { + if (TEST_COUNT(count)) { + write((size_t)p, &c, 1); + DEC_COUNT(count); + } } -static void _charc_literal(void *p, char c) { +static void _charc_literal(void *p, size_t *count, char c) { +#define CHARC_LITERAL_WRITE(s, n) \ + do { \ + if (TEST_COUNT_N(count, (n)-1)) { \ + write((size_t)p, s, n); \ + DEC_COUNT_N(count, n); \ + } \ + } while (0) + switch (c) { case '\r': - write((size_t)p, "\\r", 2); + CHARC_LITERAL_WRITE("\\r", 2); break; case '\f': - write((size_t)p, "\\f", 2); + CHARC_LITERAL_WRITE("\\f", 2); break; case '\b': - write((size_t)p, "\\b", 2); + CHARC_LITERAL_WRITE("\\b", 2); break; case '\a': - write((size_t)p, "\\a", 2); + CHARC_LITERAL_WRITE("\\a", 2); break; case '\n': - write((size_t)p, "\\n", 2); + CHARC_LITERAL_WRITE("\\n", 2); break; case '\t': - write((size_t)p, "\\t", 2); + CHARC_LITERAL_WRITE("\\t", 2); break; case '\0': - write((size_t)p, "\\0", 2); + CHARC_LITERAL_WRITE("\\0", 2); break; default: - write((size_t)p, &c, 1); + CHARC_LITERAL_WRITE(&c, 1); } } @@ -373,7 +442,9 @@ int rtl_printf(char *fmt, ...) { } int rtl_vprintf(char *fmt, va_list vlist) { - _format(NULL, _charc_stdout, fmt, vlist); + RTL_IO_LOCK(); + _format(NULL, NULL, _charc_stdout, fmt, vlist); + RTL_IO_UNLOCK(); return 1; } @@ -386,7 +457,9 @@ int rtl_eprintf(char *fmt, ...) { } int rtl_veprintf(char *fmt, va_list vlist) { - _format(NULL, _charc_stderr, fmt, vlist); + RTL_IO_LOCK(); + _format(NULL, NULL, _charc_stderr, fmt, vlist); + RTL_IO_UNLOCK(); return 1; } @@ -399,8 +472,10 @@ int rtl_dprintf(int fd, char *fmt, ...) { } int rtl_vdprintf(int fd, char *fmt, va_list vlist) { + RTL_IO_LOCK(); intptr_t fd_long = fd; - _format((void *)fd_long, _charc_file, fmt, vlist); + _format((void *)fd_long, NULL, _charc_file, fmt, vlist); + RTL_IO_UNLOCK(); return 1; } @@ -413,7 +488,29 @@ int rtl_sprintf(char *s, char *fmt, ...) { } int rtl_vsprintf(char *s, char *fmt, va_list vlist) { - _format(&s, putcp, fmt, vlist); - putcp(&s, 0); + _format(&s, NULL, putcp, fmt, vlist); + putcp(&s, NULL, 0); + return 1; +} + +int rtl_snprintf(char *s, size_t bufsize, char *fmt, ...) { + va_list va; + va_start(va, fmt); + int result = rtl_vsnprintf(s, bufsize, fmt, va); + va_end(va); + return result; +} + +int rtl_vsnprintf(char *s, size_t bufsize, char *fmt, va_list vlist) { + if (bufsize > 0) { + if (bufsize > 1) { + // Only copy `bufsize - 1` characters + --bufsize; + _format(&s, &bufsize, putcp, fmt, vlist); + ++bufsize; + } + // In any case, put `\0` as the last written character + putcp(&s, &bufsize, 0); + } return 1; } diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.h index e5b93e73ca1c9c49fa0412ccf0e6bc5c00f031a0..779bc36052461656c198467f0cc3720e80fe9e45 100644 --- a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.h +++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.h @@ -77,6 +77,23 @@ #define STDOUT(...) rtl_printf(__VA_ARGS__) #define STDERR(...) rtl_eprintf(__VA_ARGS__) +#ifdef E_ACSL_CONCURRENCY_PTHREAD +# include <pthread.h> + +/*! \brief Returns the global mutex for RTL printing. This mutex is recursive so + multiple locks can be acquired from the same thread. */ +pthread_mutex_t *rtl_io_global_mutex(); + +/*! \brief Lock the global RTL printing mutex. */ +# define RTL_IO_LOCK() pthread_mutex_lock(rtl_io_global_mutex()); + +/*! \brief Unlock the global RTL printing mutex. */ +# define RTL_IO_UNLOCK() pthread_mutex_unlock(rtl_io_global_mutex()); +#else +# define RTL_IO_LOCK() +# define RTL_IO_UNLOCK() +#endif + /* Replacement for printf with support for the above specifiers */ int rtl_printf(char *fmt, ...); int rtl_vprintf(char *fmt, va_list vlist); @@ -85,6 +102,15 @@ int rtl_vprintf(char *fmt, va_list vlist); int rtl_sprintf(char *s, char *fmt, ...); int rtl_vsprintf(char *s, char *fmt, va_list vlist); +/* Same as sprintf buf write only up to ̀bufsize - 1` characters in the buffer + and the last character is always a `\0`. + This function is more secure than `sprintf()` because if the buffer `s` is + valid for `bufsize` characters, it guarantees that there will not be an out + of bound write. This function is used for instance in `private_assert_fail()` + or in `rtl_strerror()`. */ +int rtl_snprintf(char *s, size_t bufsize, char *fmt, ...); +int rtl_vsnprintf(char *s, size_t bufsize, char *fmt, va_list vlist); + /* Same as printf but write to the error stream. */ int rtl_eprintf(char *fmt, ...); int rtl_veprintf(char *fmt, va_list vlist); diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.c index 758debdc38404376957af5272b073c2463caa589..631322b98267a0362a4f8eda700fdf3dd27e3450 100644 --- a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.c +++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.c @@ -77,19 +77,20 @@ static int native_backtrace(void **array, int size) { void trace() { #if E_ACSL_OS_IS_LINUX + RTL_IO_LOCK(); int size = 24; void **bb = private_malloc(sizeof(void *) * size); native_backtrace(bb, size); char executable[PATH_MAX]; - rtl_sprintf(executable, "/proc/%d/exe", getpid()); + rtl_snprintf(executable, sizeof(executable), "/proc/%d/exe", getpid()); STDERR("/** Backtrace **************************/\n"); int counter = 0; while (*bb) { - char *addr = (char *)private_malloc(21); - rtl_sprintf(addr, "%p", *bb); + char addr[21]; + rtl_snprintf(addr, sizeof(addr), "%p", *bb); char *ar[] = {"addr2line", "-f", "-p", "-C", "-s", "-e", executable, addr, NULL}; ipr_t *ipr = shexec(ar, NULL); @@ -112,5 +113,6 @@ void trace() { counter++; } STDERR("/***************************************/\n"); + RTL_IO_UNLOCK(); #endif /* E_ACSL_OS_IS_LINUX */ } diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.c b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.c index 4c45a5defa9a7ca6f498fc063e79b61e65ec81ea..21495817006d41613d4629a6ec55bcc53409c3ce 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.c +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.c @@ -22,464 +22,139 @@ /*! *********************************************************************** * \file - * \brief Patricia Trie API Implementation + * \brief Bittree implemented with a patricia trie. **************************************************************************/ -#include "../../internals/e_acsl_config.h" -#include "../../internals/e_acsl_malloc.h" #include "../../internals/e_acsl_private_assert.h" +#include "../internals/e_acsl_patricia_trie.h" #include "e_acsl_bittree.h" -#if E_ACSL_OS_IS_LINUX -# define WORDBITS __WORDSIZE -#elif E_ACSL_OS_IS_WINDOWS -// On windows, __WORDSIZE is not available -# ifdef _WIN64 -# define WORDBITS 64 -# else -# define WORDBITS 32 -# endif -#else -# error "Unsupported OS" -#endif - -static size_t mask(size_t, size_t); - -#if WORDBITS == 16 - -static const size_t Tmasks[] = {0x0, 0x8000, 0xc000, 0xe000, 0xf000, 0xf800, - 0xfc00, 0xfe00, 0xff00, 0xff80, 0xffc0, 0xffe0, - 0xfff0, 0xfff8, 0xfffc, 0xfffe, 0xffff}; - -static const int Teq[] = {0, -1, 3, -3, 6, -5, 7, -7, 12, - -9, 11, -11, 14, -13, 15, 16, -16}; -static const int Tneq[] = {0, 0, 1, -2, 2, -4, 5, -6, 4, - -8, 9, -10, 10, -12, 13, -14, -15}; - -#elif WORDBITS == 32 - -static const size_t Tmasks[] = { - 0x0, 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000, 0xf8000000, - 0xfc000000, 0xfe000000, 0xff000000, 0xff800000, 0xffc00000, 0xffe00000, - 0xfff00000, 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000, 0xffff8000, - 0xffffc000, 0xffffe000, 0xfffff000, 0xfffff800, 0xfffffc00, 0xfffffe00, - 0xffffff00, 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0, 0xfffffff8, - 0xfffffffc, 0xfffffffe, 0xffffffff}; - -static const int Teq[] = {0, -1, 3, -3, 6, -5, 7, -7, 12, -9, 11, - -11, 14, -13, 15, -15, 24, -17, 19, -19, 22, -21, - 23, -23, 28, -25, 27, -27, 30, -29, 31, 32, -32}; - -static const int Tneq[] = {0, 0, 1, -2, 2, -4, 5, -6, 4, -8, 9, -10, - 10, -12, 13, -14, 8, -16, 17, -18, 18, -20, 21, -22, - 20, -24, 25, -26, 26, -28, 29, -30, -31}; - -#else /* WORDBITS == 64 */ - -// clang-format off -static const size_t Tmasks[] = { -0x0,0x8000000000000000,0xc000000000000000,0xe000000000000000,0xf000000000000000, -0xf800000000000000,0xfc00000000000000,0xfe00000000000000,0xff00000000000000, -0xff80000000000000,0xffc0000000000000,0xffe0000000000000,0xfff0000000000000, -0xfff8000000000000,0xfffc000000000000,0xfffe000000000000,0xffff000000000000, -0xffff800000000000,0xffffc00000000000,0xffffe00000000000,0xfffff00000000000, -0xfffff80000000000,0xfffffc0000000000,0xfffffe0000000000,0xffffff0000000000, -0xffffff8000000000,0xffffffc000000000,0xffffffe000000000,0xfffffff000000000, -0xfffffff800000000,0xfffffffc00000000,0xfffffffe00000000,0xffffffff00000000, -0xffffffff80000000,0xffffffffc0000000,0xffffffffe0000000,0xfffffffff0000000, -0xfffffffff8000000,0xfffffffffc000000,0xfffffffffe000000,0xffffffffff000000, -0xffffffffff800000,0xffffffffffc00000,0xffffffffffe00000,0xfffffffffff00000, -0xfffffffffff80000,0xfffffffffffc0000,0xfffffffffffe0000,0xffffffffffff0000, -0xffffffffffff8000,0xffffffffffffc000,0xffffffffffffe000,0xfffffffffffff000, -0xfffffffffffff800,0xfffffffffffffc00,0xfffffffffffffe00,0xffffffffffffff00, -0xffffffffffffff80,0xffffffffffffffc0,0xffffffffffffffe0,0xfffffffffffffff0, -0xfffffffffffffff8,0xfffffffffffffffc,0xfffffffffffffffe,0xffffffffffffffff}; -// clang-format on - -static const int Teq[] = {0, -1, 3, -3, 6, -5, 7, -7, 12, -9, 11, - -11, 14, -13, 15, -15, 24, -17, 19, -19, 22, -21, - 23, -23, 28, -25, 27, -27, 30, -29, 31, -31, 48, - -33, 35, -35, 38, -37, 39, -39, 44, -41, 43, -43, - 46, -45, 47, -47, 56, -49, 51, -51, 54, -53, 55, - -55, 60, -57, 59, -59, 62, -61, 63, 64, -64}; - -static const int Tneq[] = {0, 0, 1, -2, 2, -4, 5, -6, 4, -8, 9, -10, - 10, -12, 13, -14, 8, -16, 17, -18, 18, -20, 21, -22, - 20, -24, 25, -26, 26, -28, 29, -30, 16, -32, 33, -34, - 34, -36, 37, -38, 36, -40, 41, -42, 42, -44, 45, -46, - 40, -48, 49, -50, 50, -52, 53, -54, 52, -56, 57, -58, - 58, -60, 61, -62, -63}; - -#endif - -/*! \brief Root node of the bitree */ -static bt_node *bt_root = NULL; - -/* common prefix of two addresses */ -/*@ assigns \nothing; - @ ensures \forall int i; - 0 <= i <= WORDBITS - ==> (Tmasks[i] & a) == (Tmasks[i] & b) - ==> \result >= Tmasks[i]; - @ ensures (a & \result) == (b & \result); - @ ensures \exists int i; 0 <= i <= WORDBITS && \result == Tmasks[i]; - @*/ -static size_t mask(size_t a, size_t b) { - size_t nxor = ~(a ^ b), ret; - int i = WORDBITS / 2; /* dichotomic search, starting in the middle */ - /*cpt_mask++;*/ - - /* if the current mask matches we use transition from Teq, else from Tneq - we stop as soon as i is negative, meaning that we found the mask - a negative element i from Teq or Tneq means stop and return Tmasks[-i] */ - /*@ loop invariant -WORDBITS <= i <= WORDBITS; - @ loop assigns i; - @*/ - while (i > 0) { - //@ assert 0 < i <= WORDBITS; - //@ assert \valid(Tmasks+i); - if (nxor >= Tmasks[i]) - //@ assert \valid(Teq+i); - i = Teq[i]; - else - //@ assert \valid(Tneq+i); - i = Tneq[i]; - } +static pt_struct_t *bittree = NULL; - //@ assert -WORDBITS <= i <= 0; - ret = Tmasks[-i]; - DASSERT((a & ret) == (b & ret)); - return ret; +static void *bt_get_ptr(pt_leaf_t block) { + return (void *)((bt_block *)block)->ptr; } -/* called from bt_remove */ -/* the block we are looking for has to be in the tree */ -/*@ requires \valid(ptr); - @ requires \valid(bt_root); - @ assigns \nothing; - @ ensures \valid(\result); - @ ensures \result->leaf == ptr; - @*/ -static bt_node *bt_get_leaf_from_block(bt_block *ptr) { - bt_node *curr = bt_root; - DASSERT(bt_root != NULL); - DASSERT(ptr != NULL); - - /*@ loop assigns curr; - @*/ - while (!curr->is_leaf) { - // the prefix is consistent - DASSERT((curr->addr & curr->mask) == (ptr->ptr & curr->mask)); - // two children - DASSERT(curr->left != NULL && curr->right != NULL); - // the prefix of one child is consistent - if ((curr->right->addr & curr->right->mask) - == (ptr->ptr & curr->right->mask)) - curr = curr->right; - else if ((curr->left->addr & curr->left->mask) - == (ptr->ptr & curr->left->mask)) - curr = curr->left; - else - private_abort("Unreachable\n"); - } - DASSERT(curr->is_leaf); - DASSERT(curr->leaf == ptr); - return curr; +static int bt_contains_ptr(pt_leaf_t block, void *ptr) { + uintptr_t ptr_ui = (uintptr_t)ptr; + bt_block *b = (bt_block *)block; + return ptr_ui >= b->ptr + && (ptr_ui < b->ptr + b->size || (b->size == 0 && ptr_ui == b->ptr)); } -/* remove the block from the structure */ -/* the block we are looking for has to be in the tree */ -/*@ requires \valid(ptr); - @*/ -static void bt_remove(bt_block *ptr) { - bt_node *leaf_to_delete = bt_get_leaf_from_block(ptr); - DASSERT(leaf_to_delete->leaf == ptr); - - if (leaf_to_delete->parent == NULL) - // the leaf is the root - bt_root = NULL; - else { - bt_node *sibling, *parent; - parent = leaf_to_delete->parent; - sibling = (leaf_to_delete == parent->left) ? parent->right : parent->left; - DASSERT(sibling != NULL); - // copying all sibling's fields into the parent's - parent->is_leaf = sibling->is_leaf; - parent->addr = sibling->addr; - parent->mask = sibling->mask; - parent->left = sibling->left; - parent->right = sibling->right; - parent->leaf = sibling->leaf; - if (!sibling->is_leaf) { - sibling->left->parent = parent; - sibling->right->parent = parent; - } - private_free(sibling); - /* necessary ? -- begin */ - if (parent->parent != NULL) { - parent->parent->mask = - mask(parent->parent->left->addr & parent->parent->left->mask, - parent->parent->right->addr & parent->parent->right->mask); - } - /* necessary ? -- end */ +/* erase information about initialization of a block */ +void bt_clean_block_init(bt_block *ptr) { + if (ptr->init_ptr != NULL) { + private_free(ptr->init_ptr); + ptr->init_ptr = NULL; } - private_free(leaf_to_delete); + ptr->init_bytes = 0; } -/* called from bt_insert */ -/* the returned node will be the sibling of the soon to be added node */ -/*@ requires \valid(ptr); - @ requires \valid(bt_root); - @ assigns \nothing; - @ ensures \valid(\result); - @*/ -static bt_node *bt_most_similar_node(bt_block *ptr) { - bt_node *curr = bt_root; - size_t left_prefix, right_prefix; - DASSERT(ptr != NULL); - DASSERT(bt_root != NULL); - - while (1) { - if (curr->is_leaf) - return curr; - DASSERT(curr->left != NULL && curr->right != NULL); - left_prefix = mask(curr->left->addr & curr->left->mask, ptr->ptr); - right_prefix = mask(curr->right->addr & curr->right->mask, ptr->ptr); - if (left_prefix > right_prefix) - curr = curr->left; - else if (right_prefix > left_prefix) - curr = curr->right; - else - return curr; - } +bt_block *bt_alloc_block(uintptr_t ptr, size_t size) { + bt_block *res = private_malloc(sizeof(bt_block)); + res->ptr = (uintptr_t)ptr; + res->size = size; + res->init_ptr = NULL; + res->init_bytes = 0; + res->is_readonly = 0; + res->is_freeable = 0; +#ifdef E_ACSL_DEBUG + res->line = 0; + res->file = "undefined"; +#endif +#ifdef E_ACSL_TEMPORAL + res->timestamp = NEW_TEMPORAL_TIMESTAMP(); + res->temporal_shadow = (size >= sizeof(void *)) ? private_malloc(size) : NULL; +#endif + return res; } -/* add a block in the structure */ -/*@ requires \valid(ptr); - @*/ -static void bt_insert(bt_block *ptr) { - bt_node *new_leaf; - DASSERT(ptr != NULL); - - new_leaf = private_malloc(sizeof(bt_node)); - DASSERT(new_leaf != NULL); - new_leaf->is_leaf = 1; - new_leaf->addr = ptr->ptr; - new_leaf->mask = Tmasks[WORDBITS]; /* ~0ul */ - new_leaf->left = NULL; - new_leaf->right = NULL; - new_leaf->parent = NULL; - new_leaf->leaf = ptr; - - if (bt_root == NULL) - bt_root = new_leaf; - else { - bt_node *sibling = bt_most_similar_node(ptr), *parent, *aux; - - DASSERT(sibling != NULL); - parent = private_malloc(sizeof(bt_node)); - DASSERT(parent != NULL); - parent->is_leaf = 0; - parent->addr = sibling->addr & new_leaf->addr; - /*parent->mask = mask(sibling->addr & sibling->mask, ptr->ptr);*/ - parent->leaf = NULL; - if (new_leaf->addr <= sibling->addr) { - parent->left = new_leaf; - parent->right = sibling; - } else { - parent->left = sibling; - parent->right = new_leaf; - } - new_leaf->parent = parent; - - if (sibling == bt_root) { - parent->parent = NULL; - parent->mask = mask(sibling->addr & sibling->mask, ptr->ptr); - bt_root = parent; - } else { - if (sibling->parent->left == sibling) - sibling->parent->left = parent; - else - sibling->parent->right = parent; - parent->parent = sibling->parent; - - /* necessary ? -- begin */ - aux = parent; - aux->mask = mask(aux->left->addr & aux->left->mask, - aux->right->addr & aux->right->mask); - /* necessary ? -- end */ +void bt_clean_and_free_block(bt_block *blk, int deallocate) { + if (blk) { + bt_clean_block_init(blk); + if (deallocate) { +#ifdef E_ACSL_TEMPORAL + private_free(blk->temporal_shadow); +#endif + private_free(blk); } - sibling->parent = parent; - if (!sibling->is_leaf) - sibling->mask = mask(sibling->left->addr & sibling->left->mask, - sibling->right->addr & sibling->right->mask); - - DASSERT((parent->left == sibling && parent->right == new_leaf) - || (parent->left == new_leaf && parent->right == sibling)); } } -/* return the block B such as: begin addr of B == ptr if such a block exists, - return NULL otherwise */ -/*@ assigns \nothing; - @ ensures \valid(\result); - @ ensures \result == \null || \result->ptr == (size_t)ptr; - @*/ -static bt_block *bt_lookup(void *ptr) { - bt_node *tmp = bt_root; - DASSERT(bt_root != NULL); - DASSERT(ptr != NULL); - - /*@ loop assigns tmp; - @*/ - while (!tmp->is_leaf) { - // if the ptr we are looking for does not share the prefix of tmp - if ((tmp->addr & tmp->mask) != ((size_t)ptr & tmp->mask)) - return NULL; - - // two children - DASSERT(tmp->left != NULL && tmp->right != NULL); - // the prefix of one child is consistent - if ((tmp->right->addr & tmp->right->mask) - == ((size_t)ptr & tmp->right->mask)) - tmp = tmp->right; - else if ((tmp->left->addr & tmp->left->mask) - == ((size_t)ptr & tmp->left->mask)) - tmp = tmp->left; - else - return NULL; - } - - if (tmp->leaf->ptr != (size_t)ptr) - return NULL; - return tmp->leaf; +void bt_free_block(bt_block *blk) { + bt_clean_and_free_block(blk, 1); } -/* return the block B containing ptr, such as : - begin addr of B <= ptr < (begin addr + size) of B - or NULL if such a block does not exist */ -static bt_block *bt_find(void *ptr) { - bt_node *tmp = bt_root; - if (bt_root == NULL || ptr == NULL) - return NULL; - - bt_node *other_choice = NULL; - - while (1) { - if (tmp->is_leaf) { - /* tmp cannot contain ptr because its begin addr is higher */ - if (tmp->addr > (size_t)ptr) - return NULL; - - /* tmp->addr <= ptr, tmp may contain ptr - ptr is contained if tmp is large enough (begin addr + size) */ - else if ((size_t)ptr < tmp->leaf->size + tmp->addr - || (tmp->leaf->size == 0 && (size_t)ptr == tmp->leaf->ptr)) - return tmp->leaf; - /* tmp->addr <= ptr, but tmp->addr is not large enough */ - else - return NULL; - } - - DASSERT(tmp->left != NULL && tmp->right != NULL); +/* erase all information about a block */ +static int bt_clean_with_deallocation = 0; +static void bt_clean_block(pt_leaf_t ptr) { + bt_clean_and_free_block((bt_block *)ptr, bt_clean_with_deallocation); +} - /* the right child has the highest address, so we test it first */ - if (((size_t)tmp->right->addr & tmp->right->mask) - <= ((size_t)ptr & tmp->right->mask)) { - other_choice = tmp->left; - tmp = tmp->right; - } else if (((size_t)tmp->left->addr & tmp->left->mask) - <= ((size_t)ptr & tmp->left->mask)) - tmp = tmp->left; - else { - if (other_choice == NULL) - return NULL; - else { - tmp = other_choice; - other_choice = NULL; - } +static void bt_print_block(pt_leaf_t block) { + if (block != NULL) { + bt_block *b = (bt_block *)block; + DLOG("%a; %lu Bytes; %slitteral; [init] : %d ", (char *)b->ptr, b->size, + b->is_readonly ? "" : "not ", b->init_bytes); + if (b->init_ptr != NULL) { + unsigned i; + for (i = 0; i < b->size / 8; i++) + DLOG("%b ", b->init_ptr[i]); } + DLOG("\n"); } } -/*******************/ -/* CLEAN */ -/*******************/ -/* erase information about initialization of a block */ -static void bt_clean_block_init(bt_block *ptr) { - if (ptr->init_ptr != NULL) { - private_free(ptr->init_ptr); - ptr->init_ptr = NULL; +void bt_insert(bt_block *b) { + if (bittree == NULL) { + bittree = + pt_create(bt_get_ptr, bt_contains_ptr, bt_clean_block, bt_print_block); } - ptr->init_bytes = 0; + pt_insert(bittree, (pt_leaf_t)b); } -/* erase all information about a block */ -static void bt_clean_block(bt_block *ptr) { - if (ptr) { - bt_clean_block_init(ptr); - private_free(ptr); +void bt_remove(bt_block *b) { + DASSERT(bittree != NULL); + pt_remove(bittree, (pt_leaf_t)b); +} + +bt_block *bt_lookup(void *ptr) { + if (bittree == NULL) { + return NULL; + } else { + return pt_lookup(bittree, ptr); } } -/* called from bt_clean */ -/* recursively erase the content of the structure */ -static void bt_clean_rec(bt_node *ptr) { - if (ptr == NULL) - return; - else if (ptr->is_leaf) { - bt_clean_block(ptr->leaf); - ptr->leaf = NULL; +bt_block *bt_find(void *ptr) { + if (bittree == NULL) { + return NULL; } else { - bt_clean_rec(ptr->left); - bt_clean_rec(ptr->right); - ptr->left = ptr->right = NULL; + return pt_find(bittree, ptr); } - private_free(ptr); } -/* erase the content of the structure */ -static void bt_clean() { - bt_clean_rec(bt_root); - bt_root = NULL; +void bt_clean() { + DASSERT(bittree != NULL); + // Indicates to `bt_clean` (called by `pt_destroy`) that it should deallocate + // the leaves of the tree + bt_clean_with_deallocation = 1; + pt_destroy(bittree); + bt_clean_with_deallocation = 0; + bittree = NULL; } /*********************/ /* DEBUG */ /*********************/ #ifdef E_ACSL_DEBUG -static void eacsl_bt_print_block(bt_block *ptr) { - if (ptr != NULL) { - DLOG("%a; %lu Bytes; %slitteral; [init] : %d ", (char *)ptr->ptr, ptr->size, - ptr->is_readonly ? "" : "not ", ptr->init_bytes); - if (ptr->init_ptr != NULL) { - unsigned i; - for (i = 0; i < ptr->size / 8; i++) - DLOG("%b ", ptr->init_ptr[i]); - } - DLOG("\n"); - } -} - -static void bt_print_node(bt_node *ptr, int depth) { - int i; - if (ptr == NULL) - return; - for (i = 0; i < depth; i++) - DLOG(" "); - if (ptr->is_leaf) - eacsl_bt_print_block(ptr->leaf); - else { - DLOG("%p -- %p\n", (void *)ptr->mask, (void *)ptr->addr); - bt_print_node(ptr->left, depth + 1); - bt_print_node(ptr->right, depth + 1); - } +void eacsl_bt_print_block(bt_block *ptr) { + bt_print_block((pt_leaf_t)ptr); } -static void eacsl_bt_print_tree() { - DLOG("------------DEBUG\n"); - bt_print_node(bt_root, 0); - DLOG("-----------------\n"); +void eacsl_bt_print_tree() { + pt_print(bittree); } #endif diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.h b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.h index c17dd5f4b4d5cc050055f4be944f6c5601678ac9..710226ace6248a898039b34a7dd9d8556524e616 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.h +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.h @@ -22,8 +22,8 @@ /*! *********************************************************************** * \file - * \brief Patricia Trie API - **************************************************************************/ + * \brief Bittree API +***************************************************************************/ #ifndef E_ACSL_BITTREE #define E_ACSL_BITTREE @@ -31,9 +31,17 @@ #include <stddef.h> #include <stdint.h> +/* Public API {{{ */ +/* Debug */ +#ifdef E_ACSL_DEBUG +# define eacsl_bt_print_block export_alias(bt_print_block) +# define eacsl_bt_print_tree export_alias(bt_print_tree) +#endif +/* }}} */ + /*! \brief Structure representing an allocated memory block */ struct bt_block { - size_t ptr; //!< Base address + uintptr_t ptr; //!< Base address size_t size; //!< Block length (in bytes) unsigned char *init_ptr; //!< Per-bit initialization size_t init_bytes; //!< Number of initialized bytes within a block @@ -51,54 +59,43 @@ struct bt_block { typedef struct bt_block bt_block; -/*! \brief Structure representing a bittree node */ -struct bt_node { - int is_leaf; - size_t addr, mask; - struct bt_node *left, *right, *parent; - bt_block *leaf; -}; - -typedef struct bt_node bt_node; - /*! \brief Remove a block from the structure */ -static void bt_remove(bt_block *b); +void bt_remove(bt_block *b); /*! \brief Add a block to the structure */ -static void bt_insert(bt_block *b); +void bt_insert(bt_block *b); /*! \brief Look-up a memory block by its base address NB: The function assumes that such a block exists. */ -static bt_block *bt_lookup(void *ptr); +bt_block *bt_lookup(void *ptr); /*! \brief Find a memory block containing a given memory address * * Return block B such that: * `\base_addr(B->ptr) <= ptr < (\base_addr(B->ptr) + size)` * or NULL if such a block does not exist. */ -static bt_block *bt_find(void *ptr); +bt_block *bt_find(void *ptr); /*! \brief Erase the contents of the structure */ -static void bt_clean(void); +void bt_clean(void); /*! \brief Erase information about a block's initialization */ -static void bt_clean_block_init(bt_block *b); +void bt_clean_block_init(bt_block *b); + +/*! \brief Allocates a `bt_block` for a block of memory at address `ptr` and + with the given size. */ +bt_block *bt_alloc_block(uintptr_t ptr, size_t size); -/*! \brief Erase all information about a given block */ -static void bt_clean_block(bt_block *b); +/*! \brief Frees the given `bt_block`. */ +void bt_free_block(bt_block *blk); #ifdef E_ACSL_DEBUG /*! \brief Print information about a given block */ -static void eacsl_bt_print_block(bt_block *b); - -/*! \brief Recursively print the contents of the bittree starting from a - * given node */ -/*@ assigns \nothing; */ -static void bt_print_node(bt_node *ptr, int depth); +void eacsl_bt_print_block(bt_block *b); /*! \brief Print the contents of the entire bittree */ /*@ assigns \nothing; */ -static void bt_print(); +void eacsl_bt_print_tree(); #endif #endif // E_ACSL_BITTREE diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_observation_model.c b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_observation_model.c index ea30641feaa0ddffdd322335abdb427af0801083..4a68035f8c2dcabe21588acda40da18af398b203 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_observation_model.c +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_observation_model.c @@ -39,8 +39,6 @@ /* Public API {{{ */ /* Debug */ #ifdef E_ACSL_DEBUG -# define eacsl_bt_print_block export_alias(bt_print_block) -# define eacsl_bt_print_tree export_alias(bt_print_tree) # define eacsl_block_info export_alias(block_info) # define eacsl_store_block_debug export_alias(store_block_debug) # define eacsl_delete_block_debug export_alias(delete_block_debug) @@ -304,23 +302,8 @@ void *eacsl_store_block(void *ptr, size_t size) { #endif bt_block *tmp = NULL; if (ptr) { - tmp = private_malloc(sizeof(bt_block)); - tmp->ptr = (uintptr_t)ptr; - tmp->size = size; - tmp->init_ptr = NULL; - tmp->init_bytes = 0; - tmp->is_readonly = 0; - tmp->is_freeable = 0; + tmp = bt_alloc_block((uintptr_t)ptr, size); bt_insert(tmp); -#ifdef E_ACSL_DEBUG - tmp->line = 0; - tmp->file = "undefined"; -#endif -#ifdef E_ACSL_TEMPORAL - tmp->timestamp = NEW_TEMPORAL_TIMESTAMP(); - tmp->temporal_shadow = - (size >= sizeof(void *)) ? private_malloc(size) : NULL; -#endif } return tmp; } @@ -355,12 +338,8 @@ void eacsl_delete_block(void *ptr) { private_abort("Attempt to delete untracked block\n"); #endif if (tmp) { - bt_clean_block_init(tmp); -#ifdef E_ACSL_TEMPORAL - private_free(tmp->temporal_shadow); -#endif bt_remove(tmp); - private_free(tmp); + bt_free_block(tmp); } } } @@ -655,3 +634,20 @@ void eacsl_block_info(char *p) { } #endif /* }}} */ + +/************************************************************************/ +/*** E-ACSL concurrency primitives {{{ ***/ +/************************************************************************/ + +extern int pthread_create(pthread_t *restrict thread, + const pthread_attr_t *restrict attr, + pthread_routine_t start_routine, void *restrict arg); + +int eacsl_pthread_create(pthread_t *restrict thread, + const pthread_attr_t *restrict original_attr, + pthread_routine_t start_routine, void *restrict arg) { + private_abort("Concurrency is not supported for bittree model\n"); + return EPERM; +} + +/* }}} */ diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.c b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.c index 59316ab4f16b63054fe0843b4b6c9b4df6f965d4..88c7501c2c04597650779e3fae9500678f9d4db4 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.c +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.c @@ -93,6 +93,7 @@ int eacsl_separated(size_t count, ...) { /************************************************************************/ #include "internals/e_acsl_heap_tracking.c" +#include "internals/e_acsl_patricia_trie.c" #include "internals/e_acsl_safe_locations.c" /* Select memory model, either segment-based or bittree-based model should @@ -102,6 +103,7 @@ int eacsl_separated(size_t count, ...) { # include "segment_model/e_acsl_segment_omodel_debug.c" # include "segment_model/e_acsl_segment_timestamp_retrieval.c" # include "segment_model/e_acsl_segment_tracking.c" +# include "segment_model/e_acsl_shadow_concurrency.c" # include "segment_model/e_acsl_shadow_layout.c" #elif defined E_ACSL_BITTREE_MMODEL # include "bittree_model/e_acsl_bittree.c" diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.h b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.h index 6bc4c9f7654a700397fd339f9a5f923154c57b04..c465c3b09d98cc8c45ac5a0f1e5fb301e17af6c0 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.h +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_observation_model.h @@ -31,6 +31,8 @@ #ifndef E_ACSL_OBSERVATION_MODEL_H #define E_ACSL_OBSERVATION_MODEL_H +#include <errno.h> +#include <pthread.h> #include <stddef.h> #include <stdint.h> @@ -82,6 +84,9 @@ #define eacsl_initialize export_alias(initialize) #define eacsl_full_init export_alias(full_init) +/* Concurrency */ +#define eacsl_pthread_create export_alias(pthread_create) + /* }}} */ /************************************************************************/ @@ -395,4 +400,34 @@ int eacsl_separated(size_t count, ...) __attribute__((FC_BUILTIN)); /* }}} */ +/************************************************************************/ +/*** E-ACSL concurrency primitives {{{ ***/ +/************************************************************************/ + +/*! \brief Function pointer to a function given to \p pthread_create. */ +typedef void *(*pthread_routine_t)(void *); + +/*! \brief Drop-in replacement for \p pthread_create with memory tracking + * enabled. + * + * For further information, see \p pthread_create(3). + */ +// Specification extracted from share/libc/pthread.h in Frama-C +/*@ requires valid_thread: \valid(thread); + requires valid_null_attr: attr == \null || \valid_read(attr); + requires valid_routine: \valid_function(start_routine); + requires valid_null_arg: arg == \null || \valid((char*)arg); + assigns *thread \from *attr; + assigns \result \from indirect:*attr; + ensures success_or_error: + \result == 0 || + \result == EAGAIN || \result == EINVAL || \result == EPERM; + */ +int eacsl_pthread_create(pthread_t *restrict thread, + const pthread_attr_t *restrict attr, + pthread_routine_t start_routine, void *restrict arg) + __attribute__((FC_BUILTIN)); + +/* }}} */ + #endif // E_ACSL_OBSERVATION_MODEL_H diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_patricia_trie.c b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_patricia_trie.c new file mode 100644 index 0000000000000000000000000000000000000000..4872e5ce2bfbf0fcf5a8388f423367ca4b9ca043 --- /dev/null +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_patricia_trie.c @@ -0,0 +1,621 @@ +/**************************************************************************/ +/* */ +/* This file is part of the Frama-C's E-ACSL plug-in. */ +/* */ +/* Copyright (C) 2012-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/**************************************************************************/ + +/*! *********************************************************************** + * \file + * \brief Patricia Trie API Implementation +***************************************************************************/ + +#include <stdint.h> + +#include "../../internals/e_acsl_concurrency.h" +#include "../../internals/e_acsl_config.h" +#include "../../internals/e_acsl_malloc.h" +#include "../../internals/e_acsl_private_assert.h" + +#include "e_acsl_patricia_trie.h" + +#if E_ACSL_OS_IS_LINUX +# define WORDBITS __WORDSIZE +#elif E_ACSL_OS_IS_WINDOWS +// On windows, __WORDSIZE is not available +# ifdef _WIN64 +# define WORDBITS 64 +# else +# define WORDBITS 32 +# endif +#else +# error "Unsupported OS" +#endif + +#if WORDBITS == 16 + +static const uintptr_t PT_MASKS[] = { + 0x0, 0x8000, 0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00, + 0xff80, 0xffc0, 0xffe0, 0xfff0, 0xfff8, 0xfffc, 0xfffe, 0xffff}; + +static const int PT_EQ[] = {0, -1, 3, -3, 6, -5, 7, -7, 12, + -9, 11, -11, 14, -13, 15, 16, -16}; +static const int PT_NEQ[] = {0, 0, 1, -2, 2, -4, 5, -6, 4, + -8, 9, -10, 10, -12, 13, -14, -15}; + +#elif WORDBITS == 32 + +static const uintptr_t PT_MASKS[] = { + 0x0, 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000, 0xf8000000, + 0xfc000000, 0xfe000000, 0xff000000, 0xff800000, 0xffc00000, 0xffe00000, + 0xfff00000, 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000, 0xffff8000, + 0xffffc000, 0xffffe000, 0xfffff000, 0xfffff800, 0xfffffc00, 0xfffffe00, + 0xffffff00, 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0, 0xfffffff8, + 0xfffffffc, 0xfffffffe, 0xffffffff}; + +static const int PT_EQ[] = {0, -1, 3, -3, 6, -5, 7, -7, 12, + -9, 11, -11, 14, -13, 15, -15, 24, -17, + 19, -19, 22, -21, 23, -23, 28, -25, 27, + -27, 30, -29, 31, 32, -32}; + +static const int PT_NEQ[] = {0, 0, 1, -2, 2, -4, 5, -6, 4, + -8, 9, -10, 10, -12, 13, -14, 8, -16, + 17, -18, 18, -20, 21, -22, 20, -24, 25, + -26, 26, -28, 29, -30, -31}; + +#else /* WORDBITS == 64 */ + +// clang-format off +static const size_t PT_MASKS[] = { +0x0,0x8000000000000000,0xc000000000000000,0xe000000000000000,0xf000000000000000, +0xf800000000000000,0xfc00000000000000,0xfe00000000000000,0xff00000000000000, +0xff80000000000000,0xffc0000000000000,0xffe0000000000000,0xfff0000000000000, +0xfff8000000000000,0xfffc000000000000,0xfffe000000000000,0xffff000000000000, +0xffff800000000000,0xffffc00000000000,0xffffe00000000000,0xfffff00000000000, +0xfffff80000000000,0xfffffc0000000000,0xfffffe0000000000,0xffffff0000000000, +0xffffff8000000000,0xffffffc000000000,0xffffffe000000000,0xfffffff000000000, +0xfffffff800000000,0xfffffffc00000000,0xfffffffe00000000,0xffffffff00000000, +0xffffffff80000000,0xffffffffc0000000,0xffffffffe0000000,0xfffffffff0000000, +0xfffffffff8000000,0xfffffffffc000000,0xfffffffffe000000,0xffffffffff000000, +0xffffffffff800000,0xffffffffffc00000,0xffffffffffe00000,0xfffffffffff00000, +0xfffffffffff80000,0xfffffffffffc0000,0xfffffffffffe0000,0xffffffffffff0000, +0xffffffffffff8000,0xffffffffffffc000,0xffffffffffffe000,0xfffffffffffff000, +0xfffffffffffff800,0xfffffffffffffc00,0xfffffffffffffe00,0xffffffffffffff00, +0xffffffffffffff80,0xffffffffffffffc0,0xffffffffffffffe0,0xfffffffffffffff0, +0xfffffffffffffff8,0xfffffffffffffffc,0xfffffffffffffffe,0xffffffffffffffff}; +// clang-format on + +static const int PT_EQ[] = { + 0, -1, 3, -3, 6, -5, 7, -7, 12, -9, 11, -11, 14, + -13, 15, -15, 24, -17, 19, -19, 22, -21, 23, -23, 28, -25, + 27, -27, 30, -29, 31, -31, 48, -33, 35, -35, 38, -37, 39, + -39, 44, -41, 43, -43, 46, -45, 47, -47, 56, -49, 51, -51, + 54, -53, 55, -55, 60, -57, 59, -59, 62, -61, 63, 64, -64}; + +static const int PT_NEQ[] = { + 0, 0, 1, -2, 2, -4, 5, -6, 4, -8, 9, -10, 10, + -12, 13, -14, 8, -16, 17, -18, 18, -20, 21, -22, 20, -24, + 25, -26, 26, -28, 29, -30, 16, -32, 33, -34, 34, -36, 37, + -38, 36, -40, 41, -42, 42, -44, 45, -46, 40, -48, 49, -50, + 50, -52, 53, -54, 52, -56, 57, -58, 58, -60, 61, -62, -63}; + +#endif + +typedef struct pt_node { + uintptr_t addr, mask; + struct pt_node *left, *right, *parent; + pt_leaf_t leaf; + int is_leaf; +} pt_node_t; + +typedef struct pt_struct { + /*! \brief Root node of the trie. */ + pt_node_t *root; + /*! \brief Function to extract the pointer of a leaf. */ + get_ptr_fct_t get_ptr_fct; + /*! \brief Function to test if a leaf contains a pointer. */ + contains_ptr_fct_t contains_ptr_fct; + /*! \brief Function to clean the content of a leaf. */ + clean_leaf_fct_t clean_leaf_fct; + /*! \brief Function to print the content of a leaf. */ + print_leaf_fct_t print_leaf_fct; + /*! \brief Read-write lock to concurrently access the trie. */ + E_ACSL_RWLOCK_DECL(lock); +} pt_struct_t; + +/* common prefix of two addresses */ +/*@ assigns \nothing; + @ ensures \forall int i; + 0 <= i <= WORDBITS + ==> (PT_MASKS[i] & a) == (PT_MASKS[i] & b) + ==> \result >= PT_MASKS[i]; + @ ensures (a & \result) == (b & \result); + @ ensures \exists int i; 0 <= i <= WORDBITS && \result == PT_MASKS[i]; + @*/ +static uintptr_t pt_mask(uintptr_t a, uintptr_t b) { + uintptr_t nxor = ~(a ^ b), ret; + int i = WORDBITS / 2; /* dichotomic search, starting in the middle */ + + /* if the current mask matches we use transition from PT_EQ, else from PT_NEQ + we stop as soon as i is negative, meaning that we found the mask + a negative element i from PT_EQ or PT_NEQ means stop and return PT_MASKS[-i] */ + /*@ loop invariant -WORDBITS <= i <= WORDBITS; + @ loop assigns i; + @*/ + while (i > 0) { + //@ assert 0 < i <= WORDBITS; + //@ assert \valid(PT_MASKS+i); + if (nxor >= PT_MASKS[i]) + //@ assert \valid(PT_EQ+i); + i = PT_EQ[i]; + else + //@ assert \valid(PT_NEQ+i); + i = PT_NEQ[i]; + } + + //@ assert -WORDBITS <= i <= 0; + ret = PT_MASKS[-i]; + DASSERT((a & ret) == (b & ret)); + return ret; +} + +pt_struct_t *pt_create(get_ptr_fct_t get_ptr_fct, + contains_ptr_fct_t contains_ptr_fct, + clean_leaf_fct_t clean_leaf_fct, + print_leaf_fct_t print_leaf_fct) { + DASSERT(get_ptr_fct != NULL); + DASSERT(contains_ptr_fct != NULL); + DASSERT(clean_leaf_fct != NULL); + DASSERT(print_leaf_fct != NULL); + + pt_struct_t *pt = private_malloc(sizeof(pt_struct_t)); + DASSERT(pt != NULL); + pt->root = NULL; + pt->get_ptr_fct = get_ptr_fct; + pt->contains_ptr_fct = contains_ptr_fct; + pt->clean_leaf_fct = clean_leaf_fct; + pt->print_leaf_fct = print_leaf_fct; + + E_ACSL_RWINIT(pt->lock, NULL); + return pt; +} + +void pt_destroy(pt_struct_t *pt) { + DASSERT(pt != NULL); + pt_clean(pt); + E_ACSL_RWDESTROY(pt->lock); + private_free(pt); +} + +/* called from pt_insert */ +/* the returned node will be the sibling of the soon to be added node */ +/*@ requires \valid_read(pt); + @ requires \valid_read(pt->root); + @ requires \valid_read(leaf); + @ assigns \nothing; + @ ensures \valid(\result); */ +static pt_node_t *pt_most_similar_node(const pt_struct_t *pt, pt_leaf_t leaf) { + DASSERT(pt != NULL); + DASSERT(pt->root != NULL); + DASSERT(leaf != NULL); + pt_node_t *curr = pt->root; + uintptr_t left_prefix, right_prefix; + + uintptr_t ptr = (uintptr_t)pt->get_ptr_fct(leaf); + + while (1) { + if (curr->is_leaf) { + return curr; + } + DASSERT(curr->left != NULL && curr->right != NULL); + left_prefix = pt_mask(curr->left->addr & curr->left->mask, ptr); + right_prefix = pt_mask(curr->right->addr & curr->right->mask, ptr); + if (left_prefix > right_prefix) { + curr = curr->left; + } else if (right_prefix > left_prefix) { + curr = curr->right; + } else { + return curr; + } + } +} + +void pt_insert(pt_struct_t *pt, pt_leaf_t leaf) { + DASSERT(pt != NULL); + DASSERT(leaf != NULL); + pt_node_t *new_leaf_node; + + E_ACSL_WLOCK(pt->lock); + + uintptr_t ptr = (uintptr_t)pt->get_ptr_fct(leaf); + + new_leaf_node = private_malloc(sizeof(pt_node_t)); + DASSERT(new_leaf_node != NULL); + new_leaf_node->is_leaf = 1; + new_leaf_node->addr = ptr; + new_leaf_node->mask = PT_MASKS[WORDBITS]; /* ~0ul */ + new_leaf_node->left = NULL; + new_leaf_node->right = NULL; + new_leaf_node->parent = NULL; + new_leaf_node->leaf = leaf; + + if (pt->root == NULL) { + pt->root = new_leaf_node; + } else { + pt_node_t *sibling = pt_most_similar_node(pt, leaf), *parent, *aux; + + DASSERT(sibling != NULL); + parent = private_malloc(sizeof(pt_node_t)); + DASSERT(parent != NULL); + parent->is_leaf = 0; + parent->addr = sibling->addr & new_leaf_node->addr; + /*parent->mask = pt_mask(sibling->addr & sibling->mask, ptr);*/ + parent->leaf = NULL; + if (new_leaf_node->addr <= sibling->addr) { + parent->left = new_leaf_node; + parent->right = sibling; + } else { + parent->left = sibling; + parent->right = new_leaf_node; + } + new_leaf_node->parent = parent; + + if (sibling == pt->root) { + parent->parent = NULL; + parent->mask = pt_mask(sibling->addr & sibling->mask, ptr); + pt->root = parent; + } else { + if (sibling->parent->left == sibling) { + sibling->parent->left = parent; + } else { + sibling->parent->right = parent; + } + parent->parent = sibling->parent; + + /* necessary ? -- begin */ + aux = parent; + aux->mask = pt_mask(aux->left->addr & aux->left->mask, + aux->right->addr & aux->right->mask); + /* necessary ? -- end */ + } + sibling->parent = parent; + if (!sibling->is_leaf) { + sibling->mask = pt_mask(sibling->left->addr & sibling->left->mask, + sibling->right->addr & sibling->right->mask); + } + + DASSERT((parent->left == sibling && parent->right == new_leaf_node) + || (parent->left == new_leaf_node && parent->right == sibling)); + } + + E_ACSL_RWUNLOCK(pt->lock); +} + +/* called from pt_remove */ +/* the leaf we are looking for has to be in the tree */ +/*@ requires \valid_read(pt); + @ requires \valid_read(pt->root); + @ requires \valid_read(leaf); + @ assigns \nothing; + @ ensures \valid(\result); + @ ensures \result->leaf == ptr; */ +static pt_node_t *pt_get_leaf_node_from_leaf(const pt_struct_t *pt, + pt_leaf_t leaf) { + DASSERT(pt != NULL); + DASSERT(pt->root != NULL); + DASSERT(leaf != NULL); + pt_node_t *curr = pt->root; + + uintptr_t ptr = (uintptr_t)pt->get_ptr_fct(leaf); + + /*@ loop assigns curr; */ + while (!curr->is_leaf) { + // the prefix is consistent + DASSERT((curr->addr & curr->mask) == (ptr & curr->mask)); + // two children + DASSERT(curr->left != NULL && curr->right != NULL); + // the prefix of one child is consistent + if ((curr->right->addr & curr->right->mask) == (ptr & curr->right->mask)) { + curr = curr->right; + } else if ((curr->left->addr & curr->left->mask) + == (ptr & curr->left->mask)) { + curr = curr->left; + } else { + private_abort("Unreachable\n"); + } + } + DASSERT(curr->is_leaf); + DASSERT(curr->leaf == leaf); + return curr; +} + +/** Remove the given leaf node from the patricia trie. + * + * Internal function for `pt_remove()` and `pt_remove_if()`. The function will + * delete the given leaf node and copy its sibling if it exists to the parent + * node. + */ +static void pt_remove_leaf_node(pt_struct_t *pt, + pt_node_t *leaf_node_to_delete) { + DASSERT(leaf_node_to_delete != NULL); + DASSERT(leaf_node_to_delete->is_leaf); + + if (leaf_node_to_delete->parent == NULL) { + // the leaf is the root + pt->root = NULL; + } else { + pt_node_t *sibling, *parent; + parent = leaf_node_to_delete->parent; + sibling = + (leaf_node_to_delete == parent->left) ? parent->right : parent->left; + DASSERT(sibling != NULL); + // copying all sibling's fields into the parent's + parent->is_leaf = sibling->is_leaf; + parent->addr = sibling->addr; + parent->mask = sibling->mask; + parent->left = sibling->left; + parent->right = sibling->right; + parent->leaf = sibling->leaf; + if (!sibling->is_leaf) { + sibling->left->parent = parent; + sibling->right->parent = parent; + } + private_free(sibling); + /* necessary ? -- begin */ + if (parent->parent != NULL) { + parent->parent->mask = + pt_mask(parent->parent->left->addr & parent->parent->left->mask, + parent->parent->right->addr & parent->parent->right->mask); + } + /* necessary ? -- end */ + } + pt->clean_leaf_fct(leaf_node_to_delete->leaf); + private_free(leaf_node_to_delete); +} + +void pt_remove(pt_struct_t *pt, pt_leaf_t leaf) { + DASSERT(pt != NULL); + + E_ACSL_WLOCK(pt->lock); + + pt_node_t *leaf_node_to_delete = pt_get_leaf_node_from_leaf(pt, leaf); + DASSERT(leaf_node_to_delete->leaf == leaf); + + pt_remove_leaf_node(pt, leaf_node_to_delete); + + E_ACSL_RWUNLOCK(pt->lock); +} + +/** Starting at `node`, remove all leaves that satisfy the given predicate from + * the patricia trie. Return 1 if `node` is a leaf that is removed, 0 + * otherwise. + * Internal function for `pt_remove_if()`. */ +int pt_remove_node_if(pt_struct_t *pt, pt_node_t *node, + pt_predicate_t predicate) { + DASSERT(pt != NULL); + if (node != NULL) { + if (node->is_leaf) { + if (predicate(node->leaf)) { + pt_remove_leaf_node(pt, node); + return 1; + } + } else { + // If `node->left` is a leaf that is removed, then `node->right` is + // copied to node and we have `node->left == \old(node->right->left)` + // (see `pt_remove_leaf_node()̀). + // We need to call `pt_remove_node_if()` on `node->left` until it is not + // a removed leaf. + while (pt_remove_node_if(pt, node->left, predicate)) {} + pt_remove_node_if(pt, node->right, predicate); + } + } + return 0; +} + +void pt_remove_if(pt_struct_t *pt, pt_predicate_t predicate) { + DASSERT(pt != NULL); + E_ACSL_WLOCK(pt->lock); + pt_remove_node_if(pt, pt->root, predicate); + E_ACSL_RWUNLOCK(pt->lock); +} + +pt_leaf_t pt_lookup(const pt_struct_t *pt, void *ptr) { + DASSERT(pt != NULL); + DASSERT(ptr != NULL); + + E_ACSL_RLOCK(pt->lock); + DASSERT(pt->root != NULL); + + pt_leaf_t res; + pt_node_t *tmp = pt->root; + + /*@ loop assigns tmp; + @*/ + while (!tmp->is_leaf) { + // if the ptr we are looking for does not share the prefix of tmp + if ((tmp->addr & tmp->mask) != ((uintptr_t)ptr & tmp->mask)) { + res = NULL; + goto end; + } + + // two children + DASSERT(tmp->left != NULL && tmp->right != NULL); + // the prefix of one child is consistent + if ((tmp->right->addr & tmp->right->mask) + == ((uintptr_t)ptr & tmp->right->mask)) { + tmp = tmp->right; + } else if ((tmp->left->addr & tmp->left->mask) + == ((uintptr_t)ptr & tmp->left->mask)) { + tmp = tmp->left; + } else { + res = NULL; + goto end; + } + } + + if (pt->get_ptr_fct(tmp->leaf) != ptr) { + res = NULL; + } + +end: + E_ACSL_RWUNLOCK(pt->lock); + return res; +} + +pt_leaf_t pt_find(const pt_struct_t *pt, void *ptr) { + DASSERT(pt != NULL); + E_ACSL_RLOCK(pt->lock); + + pt_leaf_t res; + if (pt->root == NULL || ptr == NULL) { + res = NULL; + goto end; + } + + pt_node_t *tmp = pt->root; + pt_node_t *other_choice = NULL; + + while (1) { + if (tmp->is_leaf) { + /* tmp cannot contain ptr because its begin addr is higher */ + if (tmp->addr > (uintptr_t)ptr) { + res = NULL; + goto end; + } + + /* tmp->addr <= ptr, tmp may contain ptr */ + else if (pt->contains_ptr_fct(tmp->leaf, ptr)) { + res = tmp->leaf; + goto end; + } + /* tmp->addr <= ptr, but tmp does not contain ptr */ + else { + res = NULL; + goto end; + } + } + + DASSERT(tmp->left != NULL && tmp->right != NULL); + + /* the right child has the highest address, so we test it first */ + if ((tmp->right->addr & tmp->right->mask) + <= ((uintptr_t)ptr & tmp->right->mask)) { + other_choice = tmp->left; + tmp = tmp->right; + } else if ((tmp->left->addr & tmp->left->mask) + <= ((uintptr_t)ptr & tmp->left->mask)) { + tmp = tmp->left; + } else { + if (other_choice == NULL) { + res = NULL; + goto end; + } else { + tmp = other_choice; + other_choice = NULL; + } + } + } + +end: + E_ACSL_RWUNLOCK(pt->lock); + return res; +} + +static pt_leaf_t pt_find_if_rec(pt_node_t *node, pt_predicate_t predicate) { + DASSERT(node != NULL); + if (node->is_leaf) { + return predicate(node->leaf) ? node->leaf : NULL; + } else { + pt_node_t *result = pt_find_if_rec(node->left, predicate); + if (result == NULL) { + result = pt_find_if_rec(node->right, predicate); + } + return result; + } +} + +pt_leaf_t pt_find_if(const pt_struct_t *pt, pt_predicate_t predicate) { + DASSERT(pt != NULL); + E_ACSL_RLOCK(pt->lock); + + pt_leaf_t res; + if (pt->root == NULL) { + res = NULL; + } else { + res = pt_find_if_rec(pt->root, predicate); + } + + E_ACSL_RWUNLOCK(pt->lock); + return res; +} + +static void pt_clean_rec(const pt_struct_t *pt, pt_node_t *ptr) { + if (ptr == NULL) { + return; + } else if (ptr->is_leaf) { + pt->clean_leaf_fct(ptr->leaf); + ptr->leaf = NULL; + } else { + pt_clean_rec(pt, ptr->left); + pt_clean_rec(pt, ptr->right); + ptr->left = ptr->right = NULL; + } + private_free(ptr); +} + +void pt_clean(pt_struct_t *pt) { + DASSERT(pt != NULL); + E_ACSL_WLOCK(pt->lock); + pt_clean_rec(pt, pt->root); + pt->root = NULL; + E_ACSL_RWUNLOCK(pt->lock); +} + +#ifdef E_ACSL_DEBUG +static void pt_print_node(const pt_struct_t *pt, pt_node_t *node, int depth) { + if (node == NULL) { + return; + } + // Indentation + for (int i = 0; i < depth; ++i) { + DLOG(" "); + } + // Print node + if (node->is_leaf) { + pt->print_leaf_fct(node->leaf); + } else { + DLOG("%p -- %p\n", (void *)node->mask, (void *)node->addr); + pt_print_node(pt, node->left, depth + 1); + pt_print_node(pt, node->right, depth + 1); + } +} + +void pt_print(const pt_struct_t *pt) { + RTL_IO_LOCK(); + DLOG("------------DEBUG\n"); + if (pt != NULL) { + E_ACSL_RLOCK(pt->lock); + pt_print_node(pt, pt->root, 0); + E_ACSL_RWUNLOCK(pt->lock); + } else { + DLOG("Patricia trie is NULL\n"); + } + DLOG("-----------------\n"); + RTL_IO_UNLOCK(); +} +#endif // E_ACSL_DEBUG diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_patricia_trie.h b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_patricia_trie.h new file mode 100644 index 0000000000000000000000000000000000000000..63a050271a909260468450edc05bc772a1ca433e --- /dev/null +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_patricia_trie.h @@ -0,0 +1,170 @@ +/**************************************************************************/ +/* */ +/* This file is part of the Frama-C's E-ACSL plug-in. */ +/* */ +/* Copyright (C) 2012-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/**************************************************************************/ + +/*! *********************************************************************** + * \file + * \brief Patricia Trie API +***************************************************************************/ + +#ifndef E_ACSL_PATRICIA_TRIE +#define E_ACSL_PATRICIA_TRIE + +#ifdef __FC_FEATURES_H +# include <__fc_alloc_axiomatic.h> +#else +/*@ ghost extern int __fc_heap_status; */ +#endif + +/*! \brief Opaque pointer representing a leaf on the patricia trie. */ +typedef void *pt_leaf_t; +/*! \brief Function pointer to a function that retrieves the pointer of a + leaf. */ +typedef void *(*get_ptr_fct_t)(pt_leaf_t); +/*! \brief Function pointer to a function that tests whether a leaf contains the + given pointer. */ +typedef int (*contains_ptr_fct_t)(pt_leaf_t, void *); +/*! \brief Function pointer to a function that cleans (i.e. free memory) the + content of a leaf. */ +typedef void (*clean_leaf_fct_t)(pt_leaf_t); +/*! \brief Function pointer to a function that prints the content of a leaf. */ +typedef void (*print_leaf_fct_t)(pt_leaf_t); +/*! \brief Function pointer to a predicate function that returns true (!= 0) or + false (== 0) for a given leaf. */ +typedef int (*pt_predicate_t)(pt_leaf_t leaf); + +/*! \brief Opaque structure of a patricia trie. */ +typedef struct pt_struct pt_struct_t; + +/*! \brief Create a patricia trie. + \param get_ptr_fct Function to extract the pointer of a leaf. + \param contains_ptr_fct Function to test if a leaf contains a pointer. + \param clean_leaf_fct Function to clean the content of a leaf. + \param print_leaf_fct Function to print the content of a leaf. + \return The newly created patricia trie. */ +/*@ requires \valid_function(get_ptr_fct_t get_ptr_fct); + @ requires \valid_function(contains_ptr_fct_t contains_ptr_fct); + @ requires \valid_function(clean_leaf_fct_t clean_leaf_fct); + @ requires \valid_function(print_leaf_fct_t print_leaf_fct); + @ allocates \result; + @ assigns *\result \from get_ptr_fct, contains_ptr_fct, clean_leaf_fct, + print_leaf_fct; + @ admit ensures \valid(\result); */ +pt_struct_t *pt_create(get_ptr_fct_t get_ptr_fct, + contains_ptr_fct_t contains_ptr_fct, + clean_leaf_fct_t clean_leaf_fct, + print_leaf_fct_t print_leaf_fct); + +/*! \brief Clean and destroy the patricia trie. + \param pt The patricia trie to destroy. */ +/*@ requires \valid(pt); + @ frees pt; */ +void pt_destroy(pt_struct_t *pt); + +/*! \brief Insert a new leaf to the patricia trie. + \param pt Patricia trie to update. + \param leaf Leaf to add to the trie. */ +/*@ requires \valid(pt); + @ assigns __fc_heap_status \from __fc_heap_status; + @ assigns *pt \from *pt, leaf, indirect:__fc_heap_status; */ +void pt_insert(pt_struct_t *pt, pt_leaf_t leaf); + +/*! \brief Remove an existing leaf from the patricia trie. + \param pt Patricia trie to update. + \param leaf Leaf to remove from the trie. */ +/*@ requires \valid(pt); + @ assigns __fc_heap_status \from __fc_heap_status; + @ assigns *pt \from *pt, leaf, indirect:__fc_heap_status; */ +void pt_remove(pt_struct_t *pt, pt_leaf_t leaf); + +/*! \brief Remove all leaves that satisfy the given predicate from the patricia + trie. + \param pt Patricia trie to update. + \param predicate Predicate to test the leaves of the trie. */ +/*@ requires \valid(pt); + @ requires \valid_function(pt_predicate_t predicate); + @ assigns __fc_heap_status \from __fc_heap_status; + @ assigns *pt \from *pt, indirect:predicate, indirect:__fc_heap_status; */ +void pt_remove_if(pt_struct_t *pt, pt_predicate_t predicate); + +/*! \brief Look for the leaf representing exactly the given pointer. + + Given the function `get_fct_ptr` provided at the trie creation and a leaf + `l`, the leaf representing exactly the given pointer `ptr` is the leaf such + that `get_fct_ptr(l) == ptr`. + + \param pt Patricia trie where to look for. + \param ptr Pointer to look for in the leaves of the patricia trie. + \return The leaf representing exactly the given pointer. */ +/*@ requires \valid_read(pt); + @ requires ptr != \null; + @ assigns \result \from *pt, indirect:ptr; */ +pt_leaf_t pt_lookup(const pt_struct_t *pt, void *ptr); + +/*! \brief Look for the leaf containing the given pointer. + + Given the function `contains_ptr_fct` provided at the trie creation and a + leaf `l`, the leaf containing the given pointer is the leaf such that + `contains_ptr_fct(l, ptr) != 0`. + + \param pt Patricia trie where to look for. + \param ptr Pointer to look for in the leaves of the patricia trie. + \return The leaf containing the given pointer. */ +/*@ requires \valid_read(pt); + @ assigns \result \from *pt, indirect:ptr; */ +pt_leaf_t pt_find(const pt_struct_t *pt, void *ptr); + +/*! \brief Look for the first leaf that satisfies the given predicate. + \param pt Patricia trie where to look for. + \param predicate Predicate to test the leaves of the trie. + \return The first leaf satisfying the given predicate. */ +/*@ requires \valid_read(pt); + @ requires \valid_function(pt_predicate_t predicate); + @ assigns \result \from *pt, indirect:predicate; */ +pt_leaf_t pt_find_if(const pt_struct_t *pt, pt_predicate_t predicate); + +/*! \brief Clean the content of the given patricia trie. + + Contrary to `pt_destroy()`, this function removes all leaves of the trie but + does not destroy the trie. The function `pt_insert()` can still be called on + the trie afterward. + + \param pt Patricia trie to update. */ +/*@ requires \valid(pt); + @ assigns __fc_heap_status \from __fc_heap_status; + @ assigns *pt \from *pt, indirect:__fc_heap_status; */ +void pt_clean(pt_struct_t *pt); + +#ifdef E_ACSL_DEBUG + +/*! \brief Print the content of the given patricia trie. + + The function `print_leaf_fct` provided at the trie creation is used to print + the leaves. + + \param pt The patricia trie to print. */ +/*@ requires pt == \null || \valid_read(pt); + @ assigns \nothing; */ +void pt_print(const pt_struct_t *pt); + +#endif // E_ACSL_DEBUG + +#endif // E_ACSL_PATRICIA_TRIE diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.c b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.c index f7ba3981504b6408c277a986d77cea0bc13c813c..4169419fdbf5030345e5414704ab2888925a738b 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.c +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.c @@ -29,11 +29,12 @@ /* An array storing safe locations up to `safe_location_counter` position. * This array should be initialized via a below function called * `collect_safe_locations`. */ -static memory_location safe_locations[16]; -static int safe_location_counter = 0; +static __thread memory_location safe_locations[16]; +static __thread int safe_location_counter = 0; #define add_safe_location(_addr, _len, _init, _on_static) \ do { \ + safe_locations[safe_location_counter].name = #_addr; \ safe_locations[safe_location_counter].address = _addr; \ safe_locations[safe_location_counter].length = _len; \ safe_locations[safe_location_counter].is_initialized = _init; \ diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.h b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.h index 68fa0d17bda37fc3b989c204c532ef8e5054ab6d..19c05fec0687b9af6b35c7628e81a2b2962cf20f 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.h +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.h @@ -36,6 +36,8 @@ /*! Simple representation of a safe location */ struct memory_location { + /*! Name of the safe location (for debug purposes) */ + const char *name; /*! Address */ uintptr_t address; /*! Byte-length */ diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_observation_model.c b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_observation_model.c index 90c2522e41f7247eecb27f2f6a02bc0183e5dea7..c04006b9e98c9e6e8607d83afdc1f636cdc3a22a 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_observation_model.c +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_observation_model.c @@ -30,106 +30,193 @@ #include <stdint.h> #include "../../instrumentation_model/e_acsl_temporal.h" +#include "../../internals/e_acsl_concurrency.h" #include "../../internals/e_acsl_debug.h" #include "../../internals/e_acsl_malloc.h" #include "../../internals/e_acsl_private_assert.h" #include "../../numerical_model/e_acsl_floating_point.h" -#include "../internals/e_acsl_safe_locations.h" #include "e_acsl_segment_tracking.h" #include "e_acsl_shadow_layout.h" #include "../e_acsl_observation_model.h" #include "../internals/e_acsl_timestamp_retrieval.h" +#ifdef E_ACSL_CONCURRENCY_PTHREAD +/*! \brief Global read-write lock for the memory model. */ +static pthread_rwlock_t __e_acsl_segment_model_global_lock = + PTHREAD_RWLOCK_INITIALIZER; +#endif + +void *malloc(size_t size) { + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); + void *result = unsafe_malloc(size); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); + return result; +} + +void *calloc(size_t nbr_elt, size_t size_elt) { + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); + void *result = unsafe_calloc(nbr_elt, size_elt); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); + return result; +} + +void *realloc(void *ptr, size_t size) { + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); + void *result = unsafe_realloc(ptr, size); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); + return result; +} + +void free(void *ptr) { + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); + unsafe_free(ptr); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); +} + +void *aligned_alloc(size_t alignment, size_t size) { + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); + void *result = unsafe_aligned_alloc(alignment, size); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); + return result; +} + +int posix_memalign(void **memptr, size_t alignment, size_t size) { + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); + int result = unsafe_posix_memalign(memptr, alignment, size); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); + return result; +} + void *eacsl_store_block(void *ptr, size_t size) { + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); /* Only stack-global memory blocks are recorded explicitly via this function. Heap blocks should be tracked internally using memory allocation functions such as malloc or calloc. */ shadow_alloca(ptr, size); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); return ptr; } void eacsl_delete_block(void *ptr) { + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); /* Block deletion should be performed on stack/global addresses only, * heap blocks should be deallocated manually via free/cfree/realloc. */ shadow_freea(ptr); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); } void *eacsl_store_block_duplicate(void *ptr, size_t size) { + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); if (allocated((uintptr_t)ptr, size, (uintptr_t)ptr)) - eacsl_delete_block(ptr); + shadow_freea(ptr); shadow_alloca(ptr, size); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); return ptr; } /*! \brief Initialize a chunk of memory given by its start address (`addr`) * and byte length (`n`). */ void eacsl_initialize(void *ptr, size_t n) { - TRY_SEGMENT((uintptr_t)ptr, initialize_heap_region((uintptr_t)ptr, n), - initialize_static_region((uintptr_t)ptr, n)) + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); + unsafe_initialize(ptr, n); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); } void eacsl_full_init(void *ptr) { - eacsl_initialize(ptr, _block_length(ptr)); + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); + unsafe_initialize(ptr, _block_length(ptr)); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); } void eacsl_mark_readonly(void *ptr) { + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); mark_readonly_region((uintptr_t)ptr, _block_length(ptr)); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); } /* ********************** */ /* E-ACSL annotations {{{ */ /* ********************** */ +int eacsl_freeable(void *ptr) { + E_ACSL_RLOCK(__e_acsl_segment_model_global_lock); + int result = unsafe_freeable(ptr); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); + return result; +} + int eacsl_valid(void *ptr, size_t size, void *ptr_base, void *addrof_base) { - return size == 0 - || (allocated((uintptr_t)ptr, size, (uintptr_t)ptr_base) + int result = size == 0; + if (!result) { + E_ACSL_RLOCK(__e_acsl_segment_model_global_lock); + result = allocated((uintptr_t)ptr, size, (uintptr_t)ptr_base) && !readonly(ptr) #ifdef E_ACSL_TEMPORAL && temporal_valid(ptr_base, addrof_base) #endif - ); + ; + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); + } + return result; } int eacsl_valid_read(void *ptr, size_t size, void *ptr_base, void *addrof_base) { - return size == 0 - || (allocated((uintptr_t)ptr, size, (uintptr_t)ptr_base) + int result = size == 0; + if (!result) { + E_ACSL_RLOCK(__e_acsl_segment_model_global_lock); + result = allocated((uintptr_t)ptr, size, (uintptr_t)ptr_base) #ifdef E_ACSL_TEMPORAL && temporal_valid(ptr_base, addrof_base) #endif - ); + ; + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); + } + return result; } /*! NB: The implementation for this function can also be specified via \p _base_addr macro that will eventually call ::TRY_SEGMENT. The following implementation is preferred for performance reasons. */ void *eacsl_base_addr(void *ptr) { - TRY_SEGMENT(ptr, return (void *)heap_info((uintptr_t)ptr, 'B'), - return (void *)static_info((uintptr_t)ptr, 'B')); - return NULL; + void *result = NULL; + E_ACSL_RLOCK(__e_acsl_segment_model_global_lock); + TRY_SEGMENT(ptr, result = (void *)heap_info((uintptr_t)ptr, 'B'), + result = (void *)static_info((uintptr_t)ptr, 'B')); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); + return result; } /*! NB: Implementation of the following function can also be specified via \p _block_length macro. A more direct approach via ::TRY_SEGMENT is preferred for performance reasons. */ size_t eacsl_block_length(void *ptr) { - TRY_SEGMENT(ptr, return heap_info((uintptr_t)ptr, 'L'), - return static_info((uintptr_t)ptr, 'L')) - return 0; + size_t result = 0; + E_ACSL_RLOCK(__e_acsl_segment_model_global_lock); + TRY_SEGMENT(ptr, result = heap_info((uintptr_t)ptr, 'L'), + result = static_info((uintptr_t)ptr, 'L')) + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); + return result; } size_t eacsl_offset(void *ptr) { - TRY_SEGMENT(ptr, return heap_info((uintptr_t)ptr, 'O'), - return static_info((uintptr_t)ptr, 'O')); - return 0; + size_t result = 0; + E_ACSL_RLOCK(__e_acsl_segment_model_global_lock); + TRY_SEGMENT(ptr, result = heap_info((uintptr_t)ptr, 'O'), + result = static_info((uintptr_t)ptr, 'O')); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); + return result; } int eacsl_initialized(void *ptr, size_t size) { + int result = 0; uintptr_t addr = (uintptr_t)ptr; - TRY_SEGMENT_WEAK(addr, return heap_initialized(addr, size), - return static_initialized(addr, size)); - return 0; + E_ACSL_RLOCK(__e_acsl_segment_model_global_lock); + TRY_SEGMENT_WEAK(addr, result = heap_initialized(addr, size), + result = static_initialized(addr, size)); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); + return result; } /* }}} */ @@ -196,67 +283,58 @@ static void argv_alloca(int *argc_ref, char ***argv_ref) { /* Program initialization {{{ */ extern int main(void); +static void do_mspaces_init() { + describe_run(); + eacsl_make_memory_spaces(64 * MB, get_heap_size()); + /* Allocate and log shadow memory layout of the execution. + Case of the segments available before main. */ + init_shadow_layout_pre_main(); +} + void mspaces_init() { - /* [already_run] avoids reentrancy issue (see Gitlab issue #83), + /* [E_ACSL_RUN_ONCE] avoids reentrancy issue (see Gitlab issue #83), e.g. in presence of a GCC's constructors that invokes malloc possibly several times before calling main. */ - static char already_run = 0; - if (!already_run) { - describe_run(); - eacsl_make_memory_spaces(64 * MB, get_heap_size()); - /* Allocate and log shadow memory layout of the execution. - Case of the segments available before main. */ - init_shadow_layout_pre_main(); - already_run = 1; - } + E_ACSL_RUN_ONCE(do_mspaces_init); } -void eacsl_memory_init(int *argc_ref, char ***argv_ref, size_t ptr_size) { - /* [already_run] avoids reentrancy issue (see Gitlab issue #83), - e.g. in presence of a recursive call to 'main' */ - static char already_run = 0; - if (!already_run) { - mspaces_init(); - /* Verify that the given size of a pointer matches the one in the present +void do_eacsl_memory_init(int *argc_ref, char ***argv_ref, size_t ptr_size) { + mspaces_init(); + /* Verify that the given size of a pointer matches the one in the present architecture. This is a guard against Frama-C instrumentations using architectures different to the given one. */ - arch_assert(ptr_size); - /* Initialize report file with debug logs (only in debug mode). */ - initialize_report_file(argc_ref, argv_ref); - /* Lift stack limit to account for extra stack memory overhead. */ - increase_stack_limit(E_ACSL_STACK_SIZE * MB); - /* Allocate and log shadow memory layout of the execution. Case of the + arch_assert(ptr_size); + /* Initialize report file with debug logs (only in debug mode). */ + initialize_report_file(argc_ref, argv_ref); + /* Lift stack limit to account for extra stack memory overhead. */ + increase_stack_limit(E_ACSL_STACK_SIZE * MB); + /* Allocate and log shadow memory layout of the execution. Case of the segments available after main. */ - init_shadow_layout_main(argc_ref, argv_ref); - //DEBUG_PRINT_LAYOUT; - /* Make sure the layout holds */ - DVALIDATE_SHADOW_LAYOUT; - /* Track program arguments. */ - if (argc_ref && argv_ref) - argv_alloca(argc_ref, argv_ref); - /* Track main function */ - shadow_alloca(&main, sizeof(&main)); - initialize_static_region((uintptr_t)&main, sizeof(&main)); - /* Tracking safe locations */ - collect_safe_locations(); - int i; - for (i = 0; i < get_safe_locations_count(); i++) { - memory_location *loc = get_safe_location(i); - if (loc->is_on_static) { - void *addr = (void *)loc->address; - uintptr_t len = loc->length; - shadow_alloca(addr, len); - if (loc->is_initialized) - eacsl_initialize(addr, len); - } - } - init_infinity_values(); - already_run = 1; - } + init_shadow_layout_main(argc_ref, argv_ref); + //DEBUG_PRINT_LAYOUT; + /* Make sure the layout holds */ + DVALIDATE_SHADOW_LAYOUT; + /* Track program arguments. */ + if (argc_ref && argv_ref) + argv_alloca(argc_ref, argv_ref); + /* Track main function */ + shadow_alloca(&main, sizeof(&main)); + initialize_static_region((uintptr_t)&main, sizeof(&main)); + /* Tracking safe locations */ + register_safe_locations(E_ACSL_REGISTER_ALL_LOCS); + init_infinity_values(); +} + +void eacsl_memory_init(int *argc_ref, char ***argv_ref, size_t ptr_size) { + /* [E_ACSL_RUN_ONCE_WITH_ARGS] avoids reentrancy issue (see Gitlab issue #83), + e.g. in presence of a recursive call to 'main'. */ + E_ACSL_RUN_ONCE_WITH_ARGS(do_eacsl_memory_init, argc_ref, argv_ref, ptr_size); } void eacsl_memory_clean(void) { + E_ACSL_WLOCK(__e_acsl_segment_model_global_lock); clean_shadow_layout(); report_heap_leaks(); + E_ACSL_RWUNLOCK(__e_acsl_segment_model_global_lock); } /* }}} */ diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_omodel_debug.c b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_omodel_debug.c index 422d25e6ebaac44a9567f33de7487c9c506425ca..72c185431409229b21b29415221141c457b973f5 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_omodel_debug.c +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_omodel_debug.c @@ -31,8 +31,10 @@ void describe_observation_model() { rtl_printf(" * Memory tracking: %s\n", E_ACSL_MMODEL_DESC); - rtl_printf(" * Heap %d MB\n", E_ACSL_HEAP_SIZE); - rtl_printf(" * Stack %d MB\n", E_ACSL_STACK_SIZE); + rtl_printf(" * Heap %d MB\n", E_ACSL_HEAP_SIZE); + rtl_printf(" * Stack %d MB\n", E_ACSL_STACK_SIZE); + rtl_printf(" * TLS %d MB\n", E_ACSL_TLS_SIZE); + rtl_printf(" * Thread stack %d MB\n", E_ACSL_THREAD_STACK_SIZE); } int allocated(uintptr_t addr, long size, uintptr_t base) { diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c index d2d45a9e820e1fe4a42fd6f6b848505cb3c13f42..04472763c8e6f3bbf20aa6a556f07322fef3e077 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c @@ -20,11 +20,15 @@ /* */ /**************************************************************************/ +#include <inttypes.h> #include <stddef.h> #include <stdint.h> +#include <stdio.h> +#include <string.h> #include "../../instrumentation_model/e_acsl_temporal_timestamp.h" #include "../../internals/e_acsl_bits.h" +#include "../../internals/e_acsl_rtl_error.h" #include "../../internals/e_acsl_rtl_string.h" #include "../internals/e_acsl_omodel_debug.h" #include "e_acsl_shadow_layout.h" @@ -583,8 +587,7 @@ static void set_heap_segment(void *ptr, size_t size, size_t alloc_size, } } -void *malloc(size_t size) { - +void *unsafe_malloc(size_t size) { size_t alloc_size = ALLOC_SIZE(size); /* Return NULL if the size is too large to be aligned */ @@ -603,7 +606,7 @@ void *malloc(size_t size) { return res; } -void *calloc(size_t nmemb, size_t size) { +void *unsafe_calloc(size_t nmemb, size_t size) { /* Since both `nmemb` and `size` are both of size `size_t` the multiplication * of the arguments (which gives the actual allocation size) might lead to an * integer overflow. The below code checks for an overflow and sets the @@ -630,7 +633,7 @@ void *calloc(size_t nmemb, size_t size) { } void *shadow_copy(const void *ptr, size_t size, int init) { - char *ret = (init) ? calloc(1, size) : malloc(size); + char *ret = (init) ? unsafe_calloc(1, size) : unsafe_malloc(size); private_assert(ret != NULL, "Shadow copy failed\n", NULL); /* Shadow copy is internal, therefore heap status should not be updated. Since it is set via `set_heap_segment`, it needs to be reverted back. */ @@ -677,7 +680,7 @@ static void unset_heap_segment(void *ptr, int init, const char *function) { } } -void free(void *ptr) { +void unsafe_free(void *ptr) { if (ptr == NULL) { /* Fail if instructed to treat NULL input to free as invalid. */ #ifdef E_ACSL_FREE_VALID_ADDRESS @@ -687,7 +690,7 @@ void free(void *ptr) { } if (ptr != NULL) { /* NULL is a valid behaviour */ - if (eacsl_freeable(ptr)) { + if (unsafe_freeable(ptr)) { unset_heap_segment(ptr, 1, "free"); public_free(ptr); } else { @@ -698,17 +701,17 @@ void free(void *ptr) { /* }}} */ /* Heap reallocation (realloc) {{{ */ -void *realloc(void *ptr, size_t size) { +void *unsafe_realloc(void *ptr, size_t size) { char *res = NULL; /* Resulting pointer */ /* If the pointer is NULL then realloc is equivalent to malloc(size) */ if (ptr == NULL) - return malloc(size); + return unsafe_malloc(size); /* If the pointer is not NULL and the size is zero then realloc is * equivalent to free(ptr) */ else if (ptr != NULL && size == 0) { - free(ptr); + unsafe_free(ptr); } else { - if (eacsl_freeable(ptr)) { /* ... and can be used as an input to `free` */ + if (unsafe_freeable(ptr)) { /* ... and can be used as an input to `free` */ size_t alloc_size = ALLOC_SIZE(size); res = public_realloc(ptr, alloc_size); DVALIDATE_ALIGNMENT(res); @@ -821,7 +824,7 @@ void *realloc(void *ptr, size_t size) { /* }}} */ /* Heap aligned allocation (aligned_alloc) {{{ */ -void *aligned_alloc(size_t alignment, size_t size) { +void *unsafe_aligned_alloc(size_t alignment, size_t size) { /* Check if: * - size and alignment are greater than zero * - alignment is a power of 2 @@ -840,7 +843,7 @@ void *aligned_alloc(size_t alignment, size_t size) { /* }}} */ /* Heap aligned allocation (posix_memalign) {{{ */ -int posix_memalign(void **memptr, size_t alignment, size_t size) { +int unsafe_posix_memalign(void **memptr, size_t alignment, size_t size) { /* Check if: * - size and alignment are greater than zero * - alignment is a power of 2 and a multiple of sizeof(void*) */ @@ -891,7 +894,7 @@ int heap_allocated(uintptr_t addr, size_t size, uintptr_t base_ptr) { return 0; } -int eacsl_freeable(void *ptr) { /* + */ +int unsafe_freeable(void *ptr) { /* + */ uintptr_t addr = (uintptr_t)ptr; /* Address is not on the program's heap, so cannot be freed */ if (!IS_ON_HEAP(addr)) @@ -1018,17 +1021,24 @@ void initialize_heap_region(uintptr_t addr, long len) { } /* }}} */ +/* Heap or static initialization {{{ */ +void unsafe_initialize(void *ptr, size_t n) { + TRY_SEGMENT((uintptr_t)ptr, initialize_heap_region((uintptr_t)ptr, n), + initialize_static_region((uintptr_t)ptr, n)) +} +/* }}} */ + /* Internal state print (debug mode) {{{ */ #ifdef E_ACSL_DEBUG -void printbyte(unsigned char c, char buf[]) { +void printbyte(unsigned char c, char buf[], size_t bufsize) { if (c >> 2 < LONG_BLOCK_INDEX_START) { - rtl_sprintf(buf, "PRIMARY: I{%u} RO{%u} OF{%2u} => %u[%u]", - checkbit(INIT_BIT, c), checkbit(READONLY_BIT, c), c >> 2, - short_lengths[c >> 2], short_offsets[c >> 2]); + rtl_snprintf(buf, bufsize, "PRIMARY: I{%u} RO{%u} OF{%2u} => %u[%u]", + checkbit(INIT_BIT, c), checkbit(READONLY_BIT, c), c >> 2, + short_lengths[c >> 2], short_offsets[c >> 2]); } else { - rtl_sprintf(buf, "SECONDARY: I{%u} RO{%u} OF{%u} => %4u", - checkbit(INIT_BIT, c), checkbit(READONLY_BIT, c), (c >> 2), - (c >> 2) - LONG_BLOCK_INDEX_START); + rtl_snprintf(buf, bufsize, "SECONDARY: I{%u} RO{%u} OF{%u} => %4u", + checkbit(INIT_BIT, c), checkbit(READONLY_BIT, c), (c >> 2), + (c >> 2) - LONG_BLOCK_INDEX_START); } } @@ -1042,12 +1052,12 @@ void print_static_shadows(uintptr_t addr, size_t size) { int i, j = 0; for (i = 0; i < size; i++) { sec_buf[0] = '\0'; - printbyte(prim_shadow[i], prim_buf); + printbyte(prim_shadow[i], prim_buf, sizeof(prim_buf)); if (IS_LONG_BLOCK(size) && (i % LONG_BLOCK) == 0) { j += 2; if (i < LONG_BLOCK_BOUNDARY(size)) { - rtl_sprintf(sec_buf, " %a SZ{%u} OF{%u}", &sec_shadow[j], - sec_shadow[j - 2], sec_shadow[j - 1]); + rtl_snprintf(sec_buf, sizeof(sec_buf), " %a SZ{%u} OF{%u}", + &sec_shadow[j], sec_shadow[j - 2], sec_shadow[j - 1]); } if (i) { DLOG("---------------------------------------------\n"); @@ -1104,10 +1114,12 @@ void print_heap_shadows(uintptr_t addr) { } void print_shadows(uintptr_t addr, size_t size) { + RTL_IO_LOCK(); if (IS_ON_STATIC(addr)) print_static_shadows(addr, size); else if (IS_ON_HEAP(addr)) print_heap_shadows(addr); + RTL_IO_UNLOCK(); } void print_memory_segment(struct memory_segment *p, char *lab, int off) { @@ -1139,7 +1151,35 @@ void print_memory_partition(struct memory_partition *p) { # endif } +# if E_ACSL_OS_IS_LINUX +/*! \brief Print the content of the `/proc/self/maps` file that is used to + retrieve the addresses informations of some segments. */ +static void print_all_segments() { + FILE *maps = fopen("/proc/self/maps", "r"); + DVASSERT(maps != NULL, "Unable to open /proc/self/maps: %s\n", + rtl_strerror(errno)); + + int result; + char buffer[255]; + uintptr_t start, end; + while (fgets(buffer, sizeof(buffer), maps) != NULL) { + result = sscanf(buffer, "%" SCNxPTR "-%" SCNxPTR, &start, &end); + if (result == 2) { + char *remaining = strchr(buffer, ' '); + DLOG("%a - %a %s", start, end, remaining ? remaining : buffer); + } else { + DLOG("%s", buffer); + } + } + + result = fclose(maps); + DVASSERT(result == 0, "Unable to close /proc/self/maps: %s\n", + rtl_strerror(errno)); +} +# endif + void print_shadow_layout() { + RTL_IO_LOCK(); DLOG(">>> HEAP ---------------------\n"); print_memory_partition(&mem_layout.heap); DLOG(">>> STACK --------------------\n"); @@ -1151,6 +1191,8 @@ void print_shadow_layout() { print_memory_partition(&mem_layout.tls); DLOG(">>> VDSO ---------------------\n"); print_memory_partition(&mem_layout.vdso); + // DLOG(">>> /proc/self/maps ----------\n"); + // print_all_segments(); # elif E_ACSL_OS_IS_WINDOWS DLOG(">>> TEXT ---------------------\n"); print_memory_partition(&mem_layout.text); @@ -1164,6 +1206,7 @@ void print_shadow_layout() { print_memory_partition(&mem_layout.rdata); # endif DLOG(">>> --------------------------\n"); + RTL_IO_UNLOCK(); } const char *which_segment(uintptr_t addr) { diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.h b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.h index 15d70d047f0942904bf14162ad8cdf77c933a581..de93d8999bf64a8b9f78535b2f9819e13c9f10d7 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.h +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.h @@ -401,11 +401,19 @@ void static_store_temporal_referent(uintptr_t addr, uint32_t ref); #endif /*}}} E_ACSL_TEMPORAL*/ /* }}} */ -/* Static initialization {{{ */ -/*! \brief The following function marks n bytes starting from the address - * given by addr as initialized. `size` equating to zero indicates that the - * whole block should be marked as initialized. */ +/* Initialization {{{ */ + +/*! \brief Unsafe version of `eacsl_initialize()` that does not lock the memory + model. */ +void unsafe_initialize(void *ptr, size_t n); + +/*! \brief The following function marks n bytes on a static region starting from + * the address given by addr as initialized. `size` equating to zero indicates + * that the whole block should be marked as initialized. */ void initialize_static_region(uintptr_t addr, long size); + +/*! \brief Mark n bytes on the heap starting from address addr as initialized */ +void initialize_heap_region(uintptr_t addr, long len); /* }}} */ /* Read-only {{{ */ @@ -418,6 +426,27 @@ void mark_readonly_region(uintptr_t addr, long size); /* }}} */ /* Heap allocation {{{ (malloc/calloc) */ + +/*! \brief Unsafe version of `malloc()` that does not lock the memory model. */ +void *unsafe_malloc(size_t size); + +/*! \brief Unsafe version of `calloc()` that does not lock the memory model. */ +void *unsafe_calloc(size_t nbr_elt, size_t size_elt); + +/*! \brief Unsafe version of `realloc()` that does not lock the memory model. */ +void *unsafe_realloc(void *ptr, size_t size); + +/*! \brief Unsafe version of `free()` that does not lock the memory model. */ +void unsafe_free(void *ptr); + +/*! \brief Unsafe version of `aligned_alloc()` that does not lock the memory + model. */ +void *unsafe_aligned_alloc(size_t alignment, size_t size); + +/*! \brief Unsafe version of `posix_memalign()` that does not lock the memory + model. */ +int unsafe_posix_memalign(void **memptr, size_t alignment, size_t size); + /** \brief Return shadowed copy of a memory chunk on a program's heap using. * If `init` parameter is set to a non-zero value the memory occupied by the * resulting block is set to be initialized and uninitialized otherwise. */ @@ -443,13 +472,16 @@ void *shadow_copy(const void *ptr, size_t size, int init); * only legal if both `p` and `p+i` point to the same block. */ int heap_allocated(uintptr_t addr, size_t size, uintptr_t base_ptr); -/*! \brief Return a non-zero value if a given address is a base address of a +/*! \brief Unsafe version of `eacsl_freeable()` that does not lock the memory + * model. + * + * Return a non-zero value if a given address is a base address of a * heap-allocated memory block that `addr` belongs to. * * As some of the other functions, \b \\freeable can be expressed using * ::IS_ON_HEAP, ::heap_allocated and ::_base_addr. Here direct * implementation is preferred for performance reasons. */ -int eacsl_freeable(void *ptr); +int unsafe_freeable(void *ptr); /*! \brief Querying information about a specific heap memory address. * This function is similar to ::static_info except it returns data @@ -474,16 +506,11 @@ uint32_t heap_temporal_info(uintptr_t addr, int origin); void heap_store_temporal_referent(uintptr_t addr, uint32_t ref); #endif /*}}} E_ACSL_TEMPORAL*/ -/* Heap initialization {{{ */ -/*! \brief Mark n bytes on the heap starting from address addr as initialized */ -void initialize_heap_region(uintptr_t addr, long len); -/* }}} */ - /* Internal state print (debug mode) {{{ */ #ifdef E_ACSL_DEBUG /* ! \brief Print human-readable representation of a byte in a primary * shadow */ -void printbyte(unsigned char c, char buf[]); +void printbyte(unsigned char c, char buf[], size_t bufsize); /*! \brief Print human-readable (well, ish) representation of a memory block * using primary and secondary shadows. */ diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_concurrency.c b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_concurrency.c new file mode 100644 index 0000000000000000000000000000000000000000..042eef56fbcf55f56be63002d2825d290ccc6570 --- /dev/null +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_concurrency.c @@ -0,0 +1,430 @@ +/**************************************************************************/ +/* */ +/* This file is part of the Frama-C's E-ACSL plug-in. */ +/* */ +/* Copyright (C) 2012-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/**************************************************************************/ + +/*! *********************************************************************** + * \file + * \brief Implementation of E-ACSL concurrency support for the shadow memory + * model. +***************************************************************************/ + +#include "e_acsl_shadow_concurrency.h" + +#ifdef E_ACSL_CONCURRENCY_PTHREAD + +# include <pthread.h> +# include <stdlib.h> +# include <string.h> + +# include "../../internals/e_acsl_concurrency.h" +# include "../../internals/e_acsl_rtl_error.h" +# include "../internals/e_acsl_patricia_trie.h" +# include "e_acsl_shadow_layout.h" + +/************************************************************************/ +/*** Patricia trie for the thread memory partitions {{{ ***/ +/* Each thread has its own stack and TLS segment. To be able to monitor the + * threaded code, we need to track those memory segments and quickly determine + * on which segment is a given pointer. + * The patricia trie structure offers great lookup performance and adequate + * insertion and removal performance for this use-case. + */ +/************************************************************************/ + +/*! Leaf of the patricia trie containing a memory segment belonging to a + thread. */ +typedef struct thread_partition { + /*! Id of the thread */ + pthread_t id; + /*! Memory segment belonging to a thread */ + memory_partition p; +} thread_partition_t; + +/*! \param leaf Leaf of the patricia trie. + \return The start address of the memory segment on the given leaf. */ +static void *tp_get_ptr(pt_leaf_t leaf) { + DASSERT(leaf != NULL); + return (void *)((thread_partition_t *)leaf)->p.application.start; +} + +/*! \param leaf Leaf of the patricia trie. + \param ptr Pointer address that we are looking for. + \return true (!= 0) if the pointer is contained in the memory segment + represented by the leaf, false (== 0) otherwise. */ +static int tp_contains_ptr(pt_leaf_t leaf, void *ptr) { + DASSERT(leaf != NULL); + thread_partition_t *tp = (thread_partition_t *)leaf; + return IS_ON(ptr, tp->p.application); +} + +/*! \brief Deallocate the leaf, i.e. deallocate the shadow regions used by the + runtime analysis for the given leaf, and the leaf itself. */ +static void tp_clean(pt_leaf_t leaf) { + DASSERT(leaf != NULL); + thread_partition_t *tp = (thread_partition_t *)leaf; + if (tp->p.primary.mspace) { + eacsl_destroy_mspace(tp->p.primary.mspace); + } + if (tp->p.secondary.mspace) { + eacsl_destroy_mspace(tp->p.secondary.mspace); + } +# ifdef E_ACSL_TEMPORAL + if (tp->p.temporal_primary.mspace) { + eacsl_destroy_mspace(tp->p.temporal_primary.mspace); + } + if (tp->p.temporal_secondary.mspace) { + eacsl_destroy_mspace(tp->p.temporal_secondary.mspace); + } +# endif + private_free(tp); +} + +/*! \brief Print the content of the given leaf */ +static void tp_print(pt_leaf_t leaf) { +# if defined(E_ACSL_DEBUG) + DASSERT(leaf != NULL); + thread_partition_t *tp = (thread_partition_t *)leaf; + DLOG("thread id: %lu\n", tp->id); + print_memory_partition(&tp->p); +# endif +} + +/*! \return true (!= 0) if the leaf corresponds to the current thread, false + (== 0) otherwise. */ +static int tp_is_same_thread(pt_leaf_t leaf) { + DASSERT(leaf != NULL); + pthread_t id = pthread_self(); + return pthread_equal(id, ((thread_partition_t *)leaf)->id); +} + +/*! Instance of patricia trie to store the memory segments of the threads. */ +pt_struct_t *thread_partitions = NULL; + +/*! \brief Creates the thread partitions trie. This function should be used with + E_ACSL_RUN_ONCE. */ +static void create_thread_partitions_trie() { + DVASSERT(thread_partitions == NULL, + "Thread partitions trie already created\n"); + thread_partitions = + pt_create(tp_get_ptr, tp_contains_ptr, tp_clean, tp_print); +} + +/* }}} */ + +/************************************************************************/ +/*** Thread shadow layout {{{ ***/ +/************************************************************************/ + +/*! \brief Fill the given `memory_partition` with the addresses of the stack + segment for the current thread. */ +static void fill_thread_layout_stack(memory_partition *pstack, + size_t stack_size) { + // Scan /proc/self/maps to retrieve the memory segment corresponding to the + // current thread stack + FILE *maps = fopen("/proc/self/maps", "r"); + DVASSERT(maps != NULL, "Unable to open /proc/self/maps: %s\n", + rtl_strerror(errno)); + + int result; + // Use the address of the local variable `maps`, stored on the stack, to find + // the segment corresponding to the current stack + uintptr_t stack_addr = (uintptr_t)&maps; + uintptr_t start, end; + char buffer[255]; + while (fgets(buffer, sizeof(buffer), maps) != NULL) { + result = sscanf(buffer, "%lx-%lx", &start, &end); + DVASSERT(result == 2, "Reading /proc/self/maps failed: %s\n", + rtl_strerror(errno)); + + if (start <= stack_addr && stack_addr <= end) { + break; + } + } + + result = fclose(maps); + DVASSERT(result == 0, "Unable to close /proc/self/maps: %s\n", + rtl_strerror(errno)); + + // Allocate shadow memory spaces and compute offsets + set_application_segment(&pstack->application, start, stack_size, + "thread_stack", NULL); + set_shadow_segment(&pstack->primary, &pstack->application, 1, + "thread_stack_primary"); + set_shadow_segment(&pstack->secondary, &pstack->application, 1, + "thread_stack_secondary"); +# ifdef E_ACSL_TEMPORAL + set_shadow_segment(&pstack->temporal_primary, &pstack->application, 1, + "temporal_thread_stack_primary"); + set_shadow_segment(&pstack->temporal_secondary, &pstack->application, 1, + "temporal_thread_stack_secondary"); +# endif +} + +/*! \brief Fill the given `memory_partition` with the addresses of the TLS + segment for the current thread. */ +static void fill_thread_layout_tls(memory_partition *ptls) { + // Since the TLS is by design specific to each thread, we can reuse the + // method used to identify the TLS segment in the main thread + set_application_segment(&ptls->application, get_tls_start(), get_tls_size(), + "thread_tls", NULL); + set_shadow_segment(&ptls->primary, &ptls->application, 1, + "thread_tls_primary"); + set_shadow_segment(&ptls->secondary, &ptls->application, 1, + "thread_tls_secondary"); +# ifdef E_ACSL_TEMPORAL + set_shadow_segment(&ptls->temporal_primary, &ptls->application, 1, + "thread_temporal_tls_primary"); + set_shadow_segment(&ptls->temporal_secondary, &ptls->application, 1, + "thread_temporal_tls_secondary"); +# endif +} + +void init_thread_shadow_layout(size_t stack_size) { + DASSERT(thread_partitions != NULL); + + pthread_t id = pthread_self(); + + thread_partition_t *stack = private_malloc(sizeof(thread_partition_t)); + stack->id = id; + fill_thread_layout_stack(&stack->p, stack_size); + pt_insert(thread_partitions, (pt_leaf_t)stack); + + thread_partition_t *tls = private_malloc(sizeof(thread_partition_t)); + tls->id = id; + fill_thread_layout_tls(&tls->p); + pt_insert(thread_partitions, (pt_leaf_t)tls); + +# if defined(E_ACSL_DEBUG) && defined(E_ACSL_DEBUG_VERBOSE) + RTL_IO_LOCK(); + DLOG(">>> Thread stack -------------\n"); + print_memory_partition(&stack->p); + DLOG(">>> Thread TLS ---------------\n"); + print_memory_partition(&tls->p); + RTL_IO_UNLOCK(); +# endif + + // Safe location tracking for thread-specific locations + register_safe_locations(E_ACSL_REGISTER_THREAD_LOCS); +} + +void clean_thread_shadow_layout() { + DASSERT(thread_partitions != NULL); + pt_remove_if(thread_partitions, tp_is_same_thread); +} + +/*! \return The memory segment corresponding to the given address or NULL if no + memory segment can be found. */ +static memory_partition *find_thread_partition(uintptr_t addr) { + memory_partition *result = NULL; + if (thread_partitions != NULL) { + thread_partition_t *tp = + (thread_partition_t *)pt_find(thread_partitions, (void *)addr); + if (tp != NULL) { + result = &tp->p; + } + } + return result; +} + +int is_on_thread(uintptr_t addr) { + memory_partition *thread_partition = find_thread_partition(addr); + return thread_partition != NULL; +} + +intptr_t primary_thread_shadow(uintptr_t addr) { + memory_partition *thread_partition = find_thread_partition(addr); + return SHADOW_ACCESS(addr, thread_partition->primary.shadow_offset); +} + +intptr_t secondary_thread_shadow(uintptr_t addr) { + memory_partition *thread_partition = find_thread_partition(addr); + return SHADOW_ACCESS(addr, thread_partition->secondary.shadow_offset); +} + +# ifdef E_ACSL_TEMPORAL +intptr_t temporal_primary_thread_shadow(uintptr_t addr) { + memory_partition *thread_partition = find_thread_partition(addr); + return SHADOW_ACCESS(addr, thread_partition->temporal_primary.shadow_offset); +} + +intptr_t temporal_secondary_thread_shadow(uintptr_t addr) { + memory_partition *thread_partition = find_thread_partition(addr); + return SHADOW_ACCESS(addr, + thread_partition->temporal_secondary.shadow_offset); +} +# endif // E_ACSL_TEMPORAL + +/* }}} */ + +/************************************************************************/ +/*** Pthread integration {{{ ***/ +/************************************************************************/ + +/*! Wrapper around the original argument used in `pthread_create`. */ +typedef struct eacsl_pthread_wrapper { + /*! The original function pointer given to `pthread_create`. */ + pthread_routine_t start_routine; + /*! The original argument given to `pthread_create`. */ + void *restrict arg; + /*! The stack size of the created thread. */ + size_t stack_size; +} eacsl_pthread_wrapper_t; + +/*! \brief Cleanup function called before destroying the thread. + + The shadow layout for the thread is destroyed and the memory allocated for + the wrapper is freed. */ +static void eacsl_pthread_cleanup(void *arg) { + clean_thread_shadow_layout(); + private_free((eacsl_pthread_wrapper_t *)arg); +} + +/*! \brief Wrapper function given to `pthread_create` instead of the original + function. + + Initialize the shadow layout and register the cleanup function. */ +static void *eacsl_pthread_wrapper(void *arg) { + void *res = NULL; + eacsl_pthread_wrapper_t *wrapped = (eacsl_pthread_wrapper_t *)arg; + init_thread_shadow_layout(wrapped->stack_size); + + // Register cleanup function + pthread_cleanup_push(eacsl_pthread_cleanup, arg); + // Execute original thread function + res = wrapped->start_routine(wrapped->arg); + // Pop and execute (argument is 1) the cleanup function + pthread_cleanup_pop(1); + return res; +} + +int eacsl_pthread_create(pthread_t *restrict thread, + const pthread_attr_t *restrict original_attr, + pthread_routine_t start_routine, void *restrict arg) { + // Initialize the thread partitions trie on the first execution of this + // function + E_ACSL_RUN_ONCE(create_thread_partitions_trie); + + // Create a wrapper for the original routine and arguments + eacsl_pthread_wrapper_t *wrapped = + private_malloc(sizeof(eacsl_pthread_wrapper_t)); + wrapped->start_routine = start_routine; + wrapped->arg = arg; + + // We need pthread creation attributes to customize the stack size for the + // thread. If the user already provided pthread creation attributes, we can + // update those, otherwise we need to use our own structure + pthread_attr_t attr; + pthread_attr_t *pattr; + if (original_attr == NULL) { + // There are no original attributes, initialize a new structure + pthread_attr_init(&attr); + pattr = &attr; + } else { + // There are original attributes, use them + pattr = (pthread_attr_t *)original_attr; + } + + // Update the stack size for the new thread, either to the default value set + // in E-ACSL, or twice the original stack size if the original stack size is + // already greater than the default value of E-ACSL + size_t original_stack_size; + pthread_attr_getstacksize(pattr, &original_stack_size); + if (original_stack_size >= E_ACSL_THREAD_STACK_SIZE * MB) { + wrapped->stack_size = original_stack_size * 2; + } else { + wrapped->stack_size = E_ACSL_THREAD_STACK_SIZE * MB; + } + pthread_attr_setstacksize(pattr, wrapped->stack_size); + + // Create the thread using our custom wrapper routine + int result = pthread_create(thread, pattr, eacsl_pthread_wrapper, wrapped); + + // Destroy the attributes if we created them earlier, or restore the stack + // size to its original value otherwise + if (original_attr == NULL) { + pthread_attr_destroy(pattr); + } else { + pthread_attr_setstacksize(pattr, original_stack_size); + } + + return result; +} + +/* }}} */ + +#else // E_ACSL_CONCURRENCY_PTHREAD + +# include <errno.h> + +# include "../../internals/e_acsl_private_assert.h" + +# define CONCURRENCY_ABORT_MESSAGE \ + "Compile with option '--concurrency' of e-acsl-gcc.sh to support " \ + "concurrency.\n" \ + "When compiling without e-acsl-gcc.sh, E_ACSL_CONCURRENCY_PTHREAD must\n " \ + "be defined and the pthread library linked.\n" + +void init_thread_shadow_layout(size_t stack_size) { + private_abort(CONCURRENCY_ABORT_MESSAGE); +} + +void clean_thread_shadow_layout() { + private_abort(CONCURRENCY_ABORT_MESSAGE); +} + +int is_on_thread(uintptr_t addr) { + return 0; +} + +intptr_t primary_thread_shadow(uintptr_t addr) { + private_abort(CONCURRENCY_ABORT_MESSAGE); + return 0; +} + +intptr_t secondary_thread_shadow(uintptr_t addr) { + private_abort(CONCURRENCY_ABORT_MESSAGE); + return 0; +} + +# ifdef E_ACSL_TEMPORAL +intptr_t temporal_primary_thread_shadow(uintptr_t addr) { + private_abort(CONCURRENCY_ABORT_MESSAGE); + return 0; +} + +intptr_t temporal_secondary_thread_shadow(uintptr_t addr) { + private_abort(CONCURRENCY_ABORT_MESSAGE); + return 0; +} +# endif // E_ACSL_TEMPORAL + +extern int pthread_create(pthread_t *restrict thread, + const pthread_attr_t *restrict attr, + pthread_routine_t start_routine, void *restrict arg); + +int eacsl_pthread_create(pthread_t *restrict thread, + const pthread_attr_t *restrict original_attr, + pthread_routine_t start_routine, void *restrict arg) { + private_abort(CONCURRENCY_ABORT_MESSAGE); + return EPERM; +} + +#endif // E_ACSL_CONCURRENCY_PTHREAD diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_concurrency.h b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_concurrency.h new file mode 100644 index 0000000000000000000000000000000000000000..73debfe97a012dfd45e06091ea398b5e5b8b42f6 --- /dev/null +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_concurrency.h @@ -0,0 +1,66 @@ +/**************************************************************************/ +/* */ +/* This file is part of the Frama-C's E-ACSL plug-in. */ +/* */ +/* Copyright (C) 2012-2021 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/**************************************************************************/ + +/*! *********************************************************************** + * \file + * \brief E-ACSL concurrency support for the shadow memory model. +***************************************************************************/ + +#ifndef E_ACSL_SHADOW_CONCURRENCY_H +#define E_ACSL_SHADOW_CONCURRENCY_H + +/* Default size of a thread stack tracked via shadow memory */ +#ifndef E_ACSL_THREAD_STACK_SIZE +# define E_ACSL_THREAD_STACK_SIZE 4 +#endif + +/*! \brief Initialize memory layout for the current thread, i.e. determine + bounds of program segments, allocate shadow memory spaces and compute + offsets. + + \param stack_size The stack size of the current thread. */ +void init_thread_shadow_layout(size_t stack_size); + +/*! \brief Deallocate shadow regions used by the runtime analysis for the + current thread. */ +void clean_thread_shadow_layout(); + +/*! \brief Evaluate to true if `addr` is a thread address. */ +int is_on_thread(uintptr_t addr); + +/*! \brief Convert a thread address into its primary shadow counterpart. */ +intptr_t primary_thread_shadow(uintptr_t addr); + +/*! \brief Convert a thread address into its secondary shadow counterpart. */ +intptr_t secondary_thread_shadow(uintptr_t addr); + +#ifdef E_ACSL_TEMPORAL +/*! \brief Convert a thread address into its primary temporal shadow + counterpart. */ +intptr_t temporal_primary_thread_shadow(uintptr_t addr); + +/*! \brief Convert a thread address into its secondary temporal shadow + counterpart. */ +intptr_t temporal_secondary_thread_shadow(uintptr_t addr); +#endif + +#endif // E_ACSL_SHADOW_CONCURRENCY_H diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.c b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.c index 9d1361b8938cc05a4997c58605263386dd829d07..258cc25fde89442abd39671ac57a6d50ace6b9d0 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.c +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.c @@ -20,11 +20,13 @@ /* */ /**************************************************************************/ -#include <errno.h> #include <stddef.h> #include "../../internals/e_acsl_malloc.h" #include "../../internals/e_acsl_private_assert.h" +#include "../../internals/e_acsl_rtl_error.h" +#include "../internals/e_acsl_safe_locations.h" +#include "e_acsl_segment_tracking.h" #include "e_acsl_shadow_layout.h" @@ -62,13 +64,13 @@ size_t increase_stack_limit(const size_t size) { rl.rlim_cur = stacksz; result = setrlimit(RLIMIT_STACK, &rl); if (result != 0) { - private_abort("setrlimit: %s \n", strerror(errno)); + private_abort("setrlimit: %s \n", rtl_strerror(errno)); } } else { stacksz = rl.rlim_cur; } } else { - private_abort("getrlimit: %s \n", strerror(errno)); + private_abort("getrlimit: %s \n", rtl_strerror(errno)); } return (size_t)stacksz; } @@ -163,7 +165,7 @@ static size_t get_global_size() { */ /*! \brief Return byte-size of the TLS segment */ -inline static size_t get_tls_size() { +inline size_t get_tls_size() { return PGM_TLS_SIZE; } @@ -219,7 +221,7 @@ static void grow_bounds_for_size(uintptr_t *min_bound, uintptr_t *max_bound, } /*! \brief Return start address of a program's TLS */ -static uintptr_t get_tls_start() { +uintptr_t get_tls_start() { size_t tls_size = get_tls_size(); uintptr_t data = (uintptr_t)&id_tdata, bss = (uintptr_t)&id_tbss; uintptr_t min_addr = data < bss ? data : bss; @@ -350,7 +352,7 @@ static void init_shadow_layout_vdso() { // (using open() instead of fopen() to avoid a dynamic allocation) int maps_fd = open("/proc/self/maps", O_RDONLY); private_assert(maps_fd >= 0, "Unable to open /proc/self/maps: %s\n", - strerror(errno)); + rtl_strerror(errno)); int result; uintptr_t start, end; @@ -370,7 +372,7 @@ static void init_shadow_layout_vdso() { end = 0; break; } else if (count < 0) { - DVABORT("Reading /proc/self/maps failed: %s\n", strerror(errno)); + DVABORT("Reading /proc/self/maps failed: %s\n", rtl_strerror(errno)); break; } else { // Scan the start and end addresses of the segment @@ -379,7 +381,7 @@ static void init_shadow_layout_vdso() { DVASSERT(result == 2, "Scanning for addresses in /proc/self/maps failed, expected 2 " "addresses, found: %d, error: %s\n", - result, strerror(errno)); + result, rtl_strerror(errno)); if (start <= vdso && vdso < end) { break; @@ -397,7 +399,7 @@ static void init_shadow_layout_vdso() { offset = lseek(maps_fd, -offset, SEEK_CUR); DVASSERT(offset != -1, "Unable to move file offset of /proc/self/maps: %s\n", - strerror(errno)); + rtl_strerror(errno)); break; } else { // No newline found on the current buffer, continue reading the file @@ -409,7 +411,7 @@ static void init_shadow_layout_vdso() { result = close(maps_fd); DVASSERT(result == 0, "Unable to close /proc/self/maps: %s\n", - strerror(errno)); + rtl_strerror(errno)); // Initialize the memory partition memory_partition *pvdso = &mem_layout.vdso; @@ -675,7 +677,7 @@ void set_shadow_segment(memory_segment *seg, memory_segment *parent, seg->name = name; seg->shadow_ratio = ratio; seg->size = parent->size / seg->shadow_ratio; - seg->mspace = eacsl_create_mspace(seg->size + SHADOW_SEGMENT_PADDING, 0); + seg->mspace = eacsl_create_locked_mspace(seg->size + SHADOW_SEGMENT_PADDING); seg->start = (uintptr_t)eacsl_mspace_malloc(seg->mspace, 1); seg->end = seg->start + seg->size - 1; seg->shadow_offset = parent->start - seg->start; @@ -706,6 +708,24 @@ void init_shadow_layout_main(int *argc_ref, char ***argv_ref) { mem_layout.is_initialized_main = 1; } +void register_safe_locations(int thread_only) { + collect_safe_locations(); + int count = get_safe_locations_count(); + for (int i = 0; i < count; ++i) { + memory_location *loc = get_safe_location(i); + if (loc->is_on_static) { + void *addr = (void *)loc->address; + size_t len = loc->length; + if (!thread_only || IS_ON_THREAD(addr)) { + shadow_alloca(addr, len); + if (loc->is_initialized) { + unsafe_initialize(addr, len); + } + } + } + } +} + void clean_shadow_layout() { if (mem_layout.is_initialized_pre_main && mem_layout.is_initialized_main) { int i; diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h index 3ed69e3d42a564beee5d663e5b2140c70494d4c1..0dc8ade8124565c23a3218867afc3c9ca51c6d93 100644 --- a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h +++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h @@ -33,6 +33,7 @@ #include "../../internals/e_acsl_config.h" #include "../../internals/e_acsl_malloc.h" +#include "e_acsl_shadow_concurrency.h" /* Default size of a program's heap tracked via shadow memory */ #ifndef E_ACSL_HEAP_SIZE @@ -44,6 +45,11 @@ # define E_ACSL_STACK_SIZE 16 #endif +/* Default size of a program's TLS tracked via shadow memory */ +#ifndef E_ACSL_TLS_SIZE +# define E_ACSL_TLS_SIZE 2 +#endif + /* MAP_ANONYMOUS is a mmap flag indicating that the contents of allocated blocks * should be nullified. Set value from <bits/mman-linux.h>, if MAP_ANONYMOUS is * undefined */ @@ -74,7 +80,7 @@ However since the TLS is next to the VDSO segment in the program layout, the default size is small enough so that both segments do not overlap. */ #ifndef PGM_TLS_SIZE -# define PGM_TLS_SIZE (2 * MB) +# define PGM_TLS_SIZE (E_ACSL_TLS_SIZE * MB) #endif /*! \brief Mspace padding used by shadow segments. This is to make sure that @@ -109,6 +115,14 @@ size_t get_stack_size(); size_t get_heap_size(); /** }}} */ +/** Thread-local storage information {{{ */ +/*! \brief Return byte-size of the TLS segment */ +size_t get_tls_size(); + +/*! \brief Return start address of a program's TLS */ +uintptr_t get_tls_start(); +/** }}} */ + /** Shadow Layout {{{ */ /***************************************************************************** * Memory Layout ************************************************************* @@ -263,6 +277,18 @@ void init_shadow_layout_pre_main(); * of the program). */ void init_shadow_layout_main(int *argc_ref, char ***argv_ref); +/*! \brief Register safe locations in the memory model. + * \param thread_only If true, only register safe locations specific to the + current thread, otherwise register all available safe locations. */ +void register_safe_locations(int thread_only); + +/*! \brief True value for the parameter of `register_safe_locations()` + * function. */ +#define E_ACSL_REGISTER_THREAD_LOCS 1 +/*! \brief False value for the parameter of `register_safe_locations()` + * function. */ +#define E_ACSL_REGISTER_ALL_LOCS 0 + /*! \brief Deallocate shadow regions used by runtime analysis */ void clean_shadow_layout(); /* }}} */ @@ -363,6 +389,13 @@ void clean_shadow_layout(); # define SECONDARY_VDSO_SHADOW(_addr) \ SHADOW_ACCESS(_addr, vdso_secondary_offset) +/*! \brief Convert a thread address into its primary shadow counterpart */ +# define PRIMARY_THREAD_SHADOW(_addr) primary_thread_shadow((uintptr_t)_addr) + +/*! \brief Convert a thread address into its secondary shadow counterpart */ +# define SECONDARY_THREAD_SHADOW(_addr) \ + secondary_thread_shadow((uintptr_t)_addr) + #elif E_ACSL_OS_IS_WINDOWS /*! \brief Convert a text address into its primary shadow counterpart */ # define PRIMARY_TEXT_SHADOW(_addr) SHADOW_ACCESS(_addr, text_primary_offset) @@ -431,6 +464,7 @@ void clean_shadow_layout(); : IS_ON_GLOBAL(_addr) ? _region##_GLOBAL_SHADOW(_addr) \ : IS_ON_TLS(_addr) ? _region##_TLS_SHADOW(_addr) \ : IS_ON_VDSO(_addr) ? _region##_VDSO_SHADOW(_addr) \ + : IS_ON_THREAD(_addr) ? _region##_THREAD_SHADOW(_addr) \ : (intptr_t)0) // clang-format on #elif E_ACSL_OS_IS_WINDOWS @@ -478,11 +512,14 @@ void clean_shadow_layout(); /*! \brief Evaluate to true if _addr is a VDSO address */ # define IS_ON_VDSO(_addr) IS_ON(_addr, mem_layout.vdso.application) +/*! \brief Evaluate to true if _addr is a thread address */ +# define IS_ON_THREAD(_addr) is_on_thread((uintptr_t)_addr) + /*! \brief Shortcut for evaluating an address via ::IS_ON_STACK, - * ::IS_ON_GLOBAL or ::IS_ON_TLS */ + * ::IS_ON_GLOBAL, ::IS_ON_TLS or ::IS_ON_THREAD */ # define IS_ON_STATIC(_addr) \ (IS_ON_STACK(_addr) || IS_ON_GLOBAL(_addr) || IS_ON_TLS(_addr) \ - || IS_ON_VDSO(_addr)) + || IS_ON_VDSO(_addr) || IS_ON_THREAD(_addr)) #elif E_ACSL_OS_IS_WINDOWS /*! \brief Evaluate to true if `_addr` is a text address */ # define IS_ON_TEXT(_addr) IS_ON(_addr, mem_layout.text.application) @@ -555,6 +592,14 @@ void clean_shadow_layout(); # define TEMPORAL_SECONDARY_VDSO_SHADOW(_addr) \ SHADOW_ACCESS(_addr, mem_layout.vdso.temporal_secondary.shadow_offset) +/*! \brief Convert a thread address into its primary temporal shadow counterpart */ +# define TEMPORAL_PRIMARY_THREAD_SHADOW(_addr) \ + temporal_primary_thread_shadow((uintptr_t)_addr) + +/*! \brief Convert a thread address into its secondary temporal shadow counterpart */ +# define TEMPORAL_SECONDARY_THREAD_SHADOW(_addr) \ + temporal_secondary_thread_shadow((uintptr_t)_addr) + # elif E_ACSL_OS_IS_WINDOWS /*! \brief Convert a text address into its primary temporal shadow counterpart */ # define TEMPORAL_PRIMARY_TEXT_SHADOW(_addr) \ diff --git a/src/plugins/wp/share/ergo/Cmath.mlw b/src/plugins/e-acsl/src/analyses/analyses.ml similarity index 64% rename from src/plugins/wp/share/ergo/Cmath.mlw rename to src/plugins/e-acsl/src/analyses/analyses.ml index 137cf15a396cfcc2fa4b9385f4fc60a026504ae2..3247c4391cb6c402265751c04ed15fea25cce9df 100644 --- a/src/plugins/wp/share/ergo/Cmath.mlw +++ b/src/plugins/e-acsl/src/analyses/analyses.ml @@ -1,9 +1,9 @@ (**************************************************************************) (* *) -(* This file is part of WP plug-in of Frama-C. *) +(* This file is part of the Frama-C's E-ACSL plug-in. *) (* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) +(* Copyright (C) 2012-2021 *) +(* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) (* you can redistribute it and/or modify it under the terms of the GNU *) @@ -20,15 +20,21 @@ (* *) (**************************************************************************) -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -(** The theory int_Abs_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -(** The theory real_RealInfix_ must be appended to this file*) -axiom abs_def : (forall x:int [abs_int(x)]. ((0 <= x) -> (abs_int(x) = x))) +let analyses_feedback msg = + Options.feedback ~level:2 "%s in %a" msg Project.pretty (Project.current ()) -axiom abs_def1 : - (forall x:int [abs_int(x)]. ((not (0 <= x)) -> (abs_int(x) = (-x)))) +let preprocess () = + let ast = Ast.get () in + analyses_feedback "preprocessing annotations"; + Logic_normalizer.preprocess ast; + analyses_feedback "normalizing quantifiers"; + Bound_variables.preprocess ast; + analyses_feedback "typing annotations"; + Typing.type_program ast +let reset () = + Memory_tracking.reset (); + Literal_strings.reset (); + Bound_variables.clear_guards (); + Logic_normalizer.clear (); + Typing.clear () diff --git a/src/plugins/wp/share/ergo/ExpLog.mlw b/src/plugins/e-acsl/src/analyses/analyses.mli similarity index 70% rename from src/plugins/wp/share/ergo/ExpLog.mlw rename to src/plugins/e-acsl/src/analyses/analyses.mli index c71d17e18b02ce657cc08c06f1cdbde2bac393ed..fe4859129ab9b0317a940d90dd21cbad9b160e81 100644 --- a/src/plugins/wp/share/ergo/ExpLog.mlw +++ b/src/plugins/e-acsl/src/analyses/analyses.mli @@ -1,9 +1,9 @@ (**************************************************************************) (* *) -(* This file is part of WP plug-in of Frama-C. *) +(* This file is part of the Frama-C's E-ACSL plug-in. *) (* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) +(* Copyright (C) 2012-2021 *) +(* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) (* you can redistribute it and/or modify it under the terms of the GNU *) @@ -20,11 +20,10 @@ (* *) (**************************************************************************) -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -(** The theory real_RealInfix_ must be appended to this file*) -(** The theory real_ExpLog_ must be appended to this file*) -axiom exp_pos : (forall x:real. (0.0 < exp(x))) +(** General module for E-ACSL analyses *) +val preprocess: unit -> unit +(** Analyses to run before starting the translation *) + +val reset: unit -> unit +(** Clear the results of the analyses *) diff --git a/src/plugins/wp/proof.mli b/src/plugins/e-acsl/src/analyses/analyses_datatype.ml similarity index 51% rename from src/plugins/wp/proof.mli rename to src/plugins/e-acsl/src/analyses/analyses_datatype.ml index 17b88dd6f51f50aef279d296735584a0e570de39..b638097ad1f4515525721ceb90d1be5a8e13b1b8 100644 --- a/src/plugins/wp/proof.mli +++ b/src/plugins/e-acsl/src/analyses/analyses_datatype.ml @@ -1,9 +1,9 @@ (**************************************************************************) (* *) -(* This file is part of WP plug-in of Frama-C. *) +(* This file is part of the Frama-C's E-ACSL plug-in. *) (* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) +(* Copyright (C) 2012-2021 *) +(* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) (* you can redistribute it and/or modify it under the terms of the GNU *) @@ -20,29 +20,48 @@ (* *) (**************************************************************************) -(* -------------------------------------------------------------------------- *) -(** Coq Proof Scripts *) -(* -------------------------------------------------------------------------- *) +(** Datatypes for analyses types *) -open WpPropId +open Cil_datatype +open Analyses_types -val is_empty_script : string -> bool -(** Check a proof script text for emptyness *) +module PredOrTerm = + Datatype.Make_with_collections + (struct + type t = pred_or_term -val delete_script_for : gid:string -> unit -(** [delete_script ~gid] remove known script for goal. *) + let name = "E_ACSL.PredOrTerm" -val add_script_for : gid:string -> string list -> string -> string -> unit -(** [new_script goal keys proof qed] registers the script [proof] - terminated by [qed] for goal [gid] and keywords [keys] *) + let reprs = + let reprs = + List.fold_left + (fun reprs t -> PoT_term t :: reprs) + [] + Term.reprs + in + List.fold_left + (fun reprs p -> PoT_pred p :: reprs) + reprs + Predicate.reprs -val parse_coqproof : string -> (string * string) option -(** [parse_coqproof f] parses a coq-file [f] and fetch the first proof. *) + include Datatype.Undefined -val savescripts : unit -> unit -(** If necessary, dump the scripts database into the file - specified by [-wp-script f]. *) + let compare pot1 pot2 = + match pot1, pot2 with + | PoT_pred _, PoT_term _ -> -1 + | PoT_term _, PoT_pred _ -> 1 + | PoT_pred p1, PoT_pred p2 -> PredicateStructEq.compare p1 p2 + | PoT_term t1, PoT_term t2 -> Term.compare t1 t2 -val script_for : pid:prop_id -> gid:string -> legacy:string -> (string * string) option -val script_for_ide : pid:prop_id -> gid:string -> legacy:string -> string * string -val hints_for : pid:prop_id -> (string * string * string) list + let equal = Datatype.from_compare + + let hash = function + | PoT_pred p -> 7 * PredicateStructEq.hash p + | PoT_term t -> 97 * Term.hash t + + let pretty fmt = function + | PoT_pred p -> Printer.pp_predicate fmt p + | PoT_term t -> Printer.pp_term fmt t + + let varname _ = "pred_or_term" + end) diff --git a/src/plugins/e-acsl/src/analyses/analyses_datatype.mli b/src/plugins/e-acsl/src/analyses/analyses_datatype.mli new file mode 100644 index 0000000000000000000000000000000000000000..212b5887cd5e0eec1b4acbb766b7b28a05ef1c75 --- /dev/null +++ b/src/plugins/e-acsl/src/analyses/analyses_datatype.mli @@ -0,0 +1,27 @@ +(**************************************************************************) +(* *) +(* This file is part of the Frama-C's E-ACSL plug-in. *) +(* *) +(* Copyright (C) 2012-2021 *) +(* CEA (Commissariat à l'énergie atomique et aux énergies *) +(* alternatives) *) +(* *) +(* you can redistribute it and/or modify it under the terms of the GNU *) +(* Lesser General Public License as published by the Free Software *) +(* Foundation, version 2.1. *) +(* *) +(* It is distributed in the hope that it will be useful, *) +(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) +(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) +(* GNU Lesser General Public License for more details. *) +(* *) +(* See the GNU Lesser General Public License version 2.1 *) +(* for more details (enclosed in the file licenses/LGPLv2.1). *) +(* *) +(**************************************************************************) + +(** Datatypes for analyses types *) + +open Analyses_types + +module PredOrTerm: Datatype.S_with_collections with type t = pred_or_term diff --git a/src/plugins/e-acsl/src/analyses/analyses_types.ml b/src/plugins/e-acsl/src/analyses/analyses_types.ml new file mode 100644 index 0000000000000000000000000000000000000000..d670f9d0e2052217223c588532bda38eb7f278e4 --- /dev/null +++ b/src/plugins/e-acsl/src/analyses/analyses_types.ml @@ -0,0 +1,37 @@ +(**************************************************************************) +(* *) +(* This file is part of the Frama-C's E-ACSL plug-in. *) +(* *) +(* Copyright (C) 2012-2021 *) +(* CEA (Commissariat à l'énergie atomique et aux énergies *) +(* alternatives) *) +(* *) +(* you can redistribute it and/or modify it under the terms of the GNU *) +(* Lesser General Public License as published by the Free Software *) +(* Foundation, version 2.1. *) +(* *) +(* It is distributed in the hope that it will be useful, *) +(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) +(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) +(* GNU Lesser General Public License for more details. *) +(* *) +(* See the GNU Lesser General Public License version 2.1 *) +(* for more details (enclosed in the file licenses/LGPLv2.1). *) +(* *) +(**************************************************************************) + +(** Types used by E-ACSL analyses *) + +open Cil_types + +type lscope_var = + | Lvs_let of logic_var * term (* the expression to which the lv is binded *) + | Lvs_quantif of term * relation * logic_var * relation * term + | Lvs_formal of logic_var * logic_info (* the logic definition *) + | Lvs_global of logic_var * term (* same as Lvs_let *) + +type lscope = lscope_var list + +type pred_or_term = + | PoT_pred of predicate + | PoT_term of term diff --git a/src/plugins/e-acsl/src/analyses/bound_variables.ml b/src/plugins/e-acsl/src/analyses/bound_variables.ml index 11c3ece5c095329e507b8786548df158a0682dad..e7eaa96b0cd410bfe1c2ce7def431d9d1a9068c3 100644 --- a/src/plugins/e-acsl/src/analyses/bound_variables.ml +++ b/src/plugins/e-acsl/src/analyses/bound_variables.ml @@ -35,6 +35,8 @@ open Cil_types open Cil_datatype +module Error = Error.Make(struct let phase = Options.Dkey.bound_variables end) + (** [error_msg quantif msg pp x] creates an error message from the string [msg] containing the value [x] pretty-printed by [pp] and the predicate [quantif] pretty-printed. *) @@ -81,11 +83,11 @@ module Quantified_predicate = module Quantifier: sig val add: predicate -> - ((term * logic_var * term) list * predicate) Error.or_error -> + ((term * logic_var * term) list * predicate) Error.result -> unit val get: predicate -> - ((term * logic_var * term) list * predicate) Error.or_error + ((term * logic_var * term) list * predicate) Error.result (** getter and setter for the additional guard that intersects with the type of the variable *) val get_guard_for_small_type : logic_var -> predicate option @@ -113,7 +115,7 @@ end = struct Cil_datatype.Logic_var.Hashtbl.add guard_tbl lv p let replace p guarded_vars goal = - Quantified_predicate.Hashtbl.replace tbl p (Error.Res (guarded_vars, goal)) + Quantified_predicate.Hashtbl.replace tbl p (Result.Ok (guarded_vars, goal)) let clear () = Cil_datatype.Logic_var.Hashtbl.clear guard_tbl; @@ -666,9 +668,9 @@ let compute_guards loc ~is_forall p bounded_vars hyps = let guards,goal = compute_quantif_guards p ~is_forall bounded_vars hyps in (* transform [guards] into [lscope_var list] *) let normalized_guards = List.map (normalize_guard ~loc) guards - in Quantifier.add p (Res (normalized_guards,goal)) + in Quantifier.add p (Result.Ok (normalized_guards,goal)) with exn -> - Quantifier.add p (Err exn) + Quantifier.add p (Result.Error exn) module Preprocessor : sig val compute : file -> unit @@ -687,11 +689,11 @@ end | Pforall _ -> Quantifier.add p - (Err (Error.Not_yet "unguarded \\forall quantification")) + (Result.Error (Error.make_not_yet "unguarded \\forall quantification")) | Pexists _ -> Quantifier.add p - (Err (Error.Not_yet "unguarded \\exists quantification")) + (Result.Error (Error.make_not_yet "unguarded \\exists quantification")) | _ -> () let do_user_predicates () = diff --git a/src/plugins/e-acsl/src/analyses/bound_variables.mli b/src/plugins/e-acsl/src/analyses/bound_variables.mli index 688e5c1ac9ef90761576655d6169c2204fe8e018..233d77ef6d7843d59e48d5756a02c8bd9d7f7b22 100644 Binary files a/src/plugins/e-acsl/src/analyses/bound_variables.mli and b/src/plugins/e-acsl/src/analyses/bound_variables.mli differ diff --git a/src/plugins/e-acsl/src/analyses/exit_points.ml b/src/plugins/e-acsl/src/analyses/exit_points.ml index c1aec33e33f88f426763e9148f47c30050cce917..be83e43663fa571fbd4f79b37d0abe9a112fe997 100644 --- a/src/plugins/e-acsl/src/analyses/exit_points.ml +++ b/src/plugins/e-acsl/src/analyses/exit_points.ml @@ -20,10 +20,14 @@ (* *) (**************************************************************************) +module E_acsl_label = Label open Cil_types open Cil_datatype -module Build_env(X: sig type t end): sig +module Build_env(X: sig + type t + val map_opt: (t -> t) option + end): sig val add: stmt -> X.t -> unit val find: stmt -> X.t (* may raise [Not_found] *) val get_all: stmt -> X.t list @@ -32,11 +36,24 @@ module Build_env(X: sig type t end): sig end = struct let tbl = Stmt.Hashtbl.create 17 - let add = Stmt.Hashtbl.add tbl + let add s x = + let s = E_acsl_label.get_first_inner_stmt s in + Stmt.Hashtbl.add tbl s x + + let find stmt = + let res = Stmt.Hashtbl.find tbl stmt in + match X.map_opt with + | Some map -> map res + | None -> res + + let get_all stmt = + let res = try Stmt.Hashtbl.find_all tbl stmt with Not_found -> [] in + match X.map_opt with + | Some map -> List.map map res + | None -> res - let find stmt = Stmt.Hashtbl.find tbl stmt - let get_all stmt = try Stmt.Hashtbl.find_all tbl stmt with Not_found -> [] let is_empty () = Stmt.Hashtbl.length tbl = 0 + let clear () = Stmt.Hashtbl.clear tbl end @@ -48,7 +65,10 @@ end scope variables given by set L', then the goto exists the scopes of variables given via set G' \ L'. Consequently, if those variables are tracked, they need to be removed from tracking. *) -module SLocals = Build_env(struct type t = Varinfo.Set.t end) +module SLocals = Build_env(struct + type t = Varinfo.Set.t + let map_opt = None + end) (* Statement to statement mapping indicating source/destination of a jump. For instance, break statements are mapped to switches or loops they jump @@ -56,11 +76,23 @@ module SLocals = Build_env(struct type t = Varinfo.Set.t end) such information does not really be computed for gotos (since they already capture references to labelled statements they jumps to). Nevertheless it is done for consistency, so all required information is stored uniformly. *) -module Exits = Build_env(struct type t = stmt end) +module Exits = Build_env(struct + type t = stmt + (* Use [Labeled_stmts.get_first_inner_stmt] so that [find] and [get_all] + return the first statement of the labeled block instead of the labeled + statement. *) + let map_opt = Some E_acsl_label.get_first_inner_stmt + end) (* Map labelled statements back to gotos which lead to them and case statements back to the corresponding switch *) -module LJumps = Build_env(struct type t = stmt end) +module LJumps = Build_env(struct + type t = stmt + (* Use [Labeled_stmts.get_first_inner_stmt] so that [find] and [get_all] + return the first statement of the labeled block instead of the labeled + statement. *) + let map_opt = Some E_acsl_label.get_first_inner_stmt + end) let clear () = SLocals.clear (); diff --git a/src/plugins/e-acsl/src/analyses/interval.ml b/src/plugins/e-acsl/src/analyses/interval.ml index 42c19e2aeb1608d5a68bfc6db6dc259fd93a7ba8..472b894a5c219aca5ae41ba86c09b24baf3bd658 100644 --- a/src/plugins/e-acsl/src/analyses/interval.ml +++ b/src/plugins/e-acsl/src/analyses/interval.ml @@ -26,6 +26,8 @@ open Cil_types devenir plus rapide, plus précis et plus mince". Also implements a support for real numbers. *) +module Error = Error.Make(struct let phase = Options.Dkey.interval end) + (* ********************************************************************* *) (* Basic datatypes and operations *) (* ********************************************************************* *) @@ -849,7 +851,6 @@ let rec infer t = | Tlambda (_,_) | TConst (LStr _ | LWStr _) | TBinOp (PlusPI,_,_) - | TBinOp (IndexPI,_,_) | TBinOp (MinusPI,_,_) | TAddrOf _ | TStartOf _ diff --git a/src/plugins/e-acsl/src/code_generator/label.ml b/src/plugins/e-acsl/src/analyses/label.ml similarity index 64% rename from src/plugins/e-acsl/src/code_generator/label.ml rename to src/plugins/e-acsl/src/analyses/label.ml index 7a3ae98c22e89831fec011763bb0f98eaf626f6d..05f6715748a31b690aa110b17a67c53281cd4dde 100644 --- a/src/plugins/e-acsl/src/code_generator/label.ml +++ b/src/plugins/e-acsl/src/analyses/label.ml @@ -21,46 +21,17 @@ (**************************************************************************) open Cil_types +module Error = Error.Make(struct let phase = Options.Dkey.translation end) -(* The keys are the stmts which were previously labeled, whereas the associated - values are the new stmts containing the same labels. *) -module Labeled_stmts = - Cil_state_builder.Stmt_hashtbl - (Cil_datatype.Stmt) - (struct - let size = 7 - let dependencies = [] (* delayed *) - let name = "E-ACSL.Labels" - end) - -let self = Labeled_stmts.self - -let move kf ~old new_stmt = - let labels = old.labels in - match labels with - | [] -> () - | _ :: _ -> - old.labels <- []; - new_stmt.labels <- labels @ new_stmt.labels; - Labeled_stmts.add old new_stmt; - (* move annotations from the old labeled stmt to the new one *) - let l = Annotations.fold_code_annot (fun e ca l -> (e, ca) :: l) old [] in - List.iter - (fun (e, ca) -> - Annotations.remove_code_annot ~kf e old ca; - Annotations.add_code_annot ~keep_empty:false ~kf e new_stmt ca) - l; - (* update the gotos of the function jumping to one of the labels *) - let f = - try Kernel_function.get_definition kf - with Kernel_function.No_Definition -> assert false - in - let mv_label s = match s.skind with - | Goto(s_ref, _) when Cil_datatype.Stmt.equal !s_ref old -> - s_ref := new_stmt - | _ -> () - in - List.iter mv_label f.sallstmts +let get_first_inner_stmt stmt = + match stmt.labels, stmt.skind with + | [], _ -> stmt + | _ :: _, Block { bstmts = dest_stmt :: _ } -> + dest_stmt + | labels, _ -> + Options.fatal "Unexpected stmt:\nlabels: [%a]\nstmt: %a" + (Pretty_utils.pp_list ~sep:"; " Cil_types_debug.pp_label) labels + Printer.pp_stmt stmt let get_stmt kf llabel = let stmt = match llabel with @@ -79,7 +50,7 @@ let get_stmt kf llabel = in (* the pointed statement has been visited and modified by the injector: get its new version. *) - try Labeled_stmts.find stmt with Not_found -> stmt + get_first_inner_stmt stmt (* Local Variables: diff --git a/src/plugins/e-acsl/src/code_generator/label.mli b/src/plugins/e-acsl/src/analyses/label.mli similarity index 91% rename from src/plugins/e-acsl/src/code_generator/label.mli rename to src/plugins/e-acsl/src/analyses/label.mli index 21e8c312456e628243dc33feb7a3297d708a4f7d..6244536ac724e0684d3f48ffe90deeb7a999aec1 100644 --- a/src/plugins/e-acsl/src/code_generator/label.mli +++ b/src/plugins/e-acsl/src/analyses/label.mli @@ -22,14 +22,12 @@ open Cil_types -val move: kernel_function -> old:stmt -> stmt -> unit -(** Move all labels of the [old] stmt onto the new [stmt]. *) - val get_stmt: kernel_function -> logic_label -> stmt (** @return the statement where the logic label points to. *) -val self: State.t -(** Internal state *) +val get_first_inner_stmt: stmt -> stmt +(** If the given statement has a label, return the first statement of the block. + Otherwise return the given statement. *) (* Local Variables: diff --git a/src/plugins/e-acsl/src/analyses/logic_normalizer.ml b/src/plugins/e-acsl/src/analyses/logic_normalizer.ml index 2f48bf1f49dd81b70298cc4166004c646b76f53d..bc2b125769d3f2132e603764a329775e06911caf 100644 --- a/src/plugins/e-acsl/src/analyses/logic_normalizer.ml +++ b/src/plugins/e-acsl/src/analyses/logic_normalizer.ml @@ -21,8 +21,7 @@ (**************************************************************************) open Cil_types - -type pred_or_term = Lscope.pred_or_term +open Analyses_types module Id_predicate = Datatype.Make_with_collections @@ -53,7 +52,7 @@ end = struct let get_pred p = try Id_predicate.Hashtbl.find tbl_pred p - with Not_found -> Lscope.PoT_pred p + with Not_found -> PoT_pred p let memo_pred process p = try ignore (Id_predicate.Hashtbl.find tbl_pred p) with @@ -98,7 +97,7 @@ let preprocess_pred ~loc p = | Pvalid _ -> Logic_const.pvalid ~loc (llabel, t) | _ -> assert false in - Some (Lscope.PoT_pred (Logic_const.pand ~loc (init, p_copy))) + Some (PoT_pred (Logic_const.pand ~loc (init, p_copy))) | _ -> None end | _ -> None diff --git a/src/plugins/e-acsl/src/analyses/logic_normalizer.mli b/src/plugins/e-acsl/src/analyses/logic_normalizer.mli index f0cc0782b21005038303b71f706ce3444c26c1d2..7eafabeb5287e0dcae03d0a935438077ad5117d7 100644 --- a/src/plugins/e-acsl/src/analyses/logic_normalizer.mli +++ b/src/plugins/e-acsl/src/analyses/logic_normalizer.mli @@ -30,6 +30,7 @@ *) open Cil_types +open Analyses_types val preprocess : file -> unit (** Preprocess all the predicates of the ast and store the results *) @@ -41,7 +42,7 @@ val preprocess_annot : code_annotation -> unit val preprocess_predicate : predicate -> unit (** Preprocess a predicate and its children and store the results *) -val get_pred : predicate -> Lscope.pred_or_term +val get_pred : predicate -> pred_or_term (** Retrieve the preprocessed form of a predicate *) val get_term : term -> term (** Retrieve the preprocessed form of a term *) diff --git a/src/plugins/e-acsl/src/analyses/lscope.ml b/src/plugins/e-acsl/src/analyses/lscope.ml index 6d98b00323987bc5912e9610af6d24819e7a689e..3c6db344d7524c5687a20b99181e6eddbfc46a01 100644 --- a/src/plugins/e-acsl/src/analyses/lscope.ml +++ b/src/plugins/e-acsl/src/analyses/lscope.ml @@ -21,14 +21,10 @@ (**************************************************************************) open Cil_types +open Cil_datatype +open Analyses_types -type lscope_var = - | Lvs_let of logic_var * term - | Lvs_quantif of term * relation * logic_var * relation * term - | Lvs_formal of logic_var * logic_info - | Lvs_global of logic_var * term - -type t = lscope_var list +type t = lscope (* The logic scope is usually small, so a list is fine instead of a Map *) let empty = [] @@ -37,7 +33,10 @@ let is_empty = function [] -> true | _ :: _ -> false let add lscope_var t = lscope_var :: t -let get_all t = List.rev t +let remove lscope_var t = + List.filter (fun elt -> elt != lscope_var) t + +let get_all t = t let exists lv t = let is_lv = function @@ -47,8 +46,6 @@ let exists lv t = in List.exists is_lv t -type pred_or_term = PoT_pred of predicate | PoT_term of term - exception Lscope_used let is_used lscope pot = let o = object inherit Visitor.frama_c_inplace @@ -65,6 +62,125 @@ let is_used lscope pot = with Lscope_used -> true +let rank_lvar = function + | Lvs_let _ -> 0 + | Lvs_quantif _ -> 1 + | Lvs_formal _ -> 2 + | Lvs_global _ -> 3 + +let hash_list f = List.fold_left (fun acc d -> 65537 * acc + f d) 1 + +let pretty_lscope_var fmt lscope_var = + match lscope_var with + | Lvs_let (lv, t) -> + Format.fprintf fmt "@[Lvs_let (%a = %a)@]" + Printer.pp_logic_var lv + Printer.pp_term t + | Lvs_quantif (lt, lr, lv, rr, rt) -> + Format.fprintf fmt "@[Lvs_quantif (%a %a %a %a %a)@]" + Printer.pp_term lt + Printer.pp_relation lr + Printer.pp_logic_var lv + Printer.pp_relation rr + Printer.pp_term rt + | Lvs_formal (lv, li) -> + Format.fprintf fmt "@[Lvs_formal (%a, %a)@]" + Printer.pp_logic_var lv + Printer.pp_logic_info li + | Lvs_global (lv, t) -> + Format.fprintf fmt "@[Lvs_global (%a, %a)@]" + Printer.pp_logic_var lv + Printer.pp_term t + +module D = Datatype.Make(struct + type t = lscope + + let name = "E_ACSL.Lscope" + + let reprs = + let reprs = + List.fold_left + (fun reprs lv -> + List.fold_left + (fun reprs t -> Lvs_let (lv, t) :: reprs) + reprs + Term.reprs) + [] + Logic_var.reprs + in + [ reprs; []] + + include Datatype.Undefined + + let compare lscope1 lscope2 = + let lscope_vars1 = get_all lscope1 in + let lscope_vars2 = get_all lscope2 in + Extlib.list_compare + (fun lscope_var1 lscope_var2 -> + let r1 = rank_lvar lscope_var1 in + let r2 = rank_lvar lscope_var2 in + if r1 <> r2 then r1 - r2 else + match lscope_var1, lscope_var2 with + | Lvs_let (lv1, t1), Lvs_let (lv2, t2) -> + let c = Logic_var.compare lv1 lv2 in + if c <> 0 then c else Term.compare t1 t2 + | Lvs_quantif (lt1, lr1, lv1, rr1, rt1), + Lvs_quantif (lt2, lr2, lv2, rr2, rt2) -> + let c = Logic_var.compare lv1 lv2 in + let c = + if c <> 0 then c + else Term.compare lt1 lt2 + in + let c = + if c <> 0 then c + else Term.compare rt1 rt2 + in + let c = + if c <> 0 then c + else compare lr1 lr2 + in + let c = + if c <> 0 then c + else compare rr1 rr2 + in + c + | Lvs_formal (lv1, li1), Lvs_formal (lv2, li2) -> + let c = Logic_var.compare lv1 lv2 in + if c <> 0 then c else Logic_info.compare li1 li2 + | Lvs_global (lv1, t1), Lvs_global (lv2, t2) -> + let c = Logic_var.compare lv1 lv2 in + if c <> 0 then c else Term.compare t1 t2 + | (Lvs_let _ | Lvs_quantif _ | Lvs_formal _ | Lvs_global _), _ -> + assert false + ) + lscope_vars1 + lscope_vars2 + + let hash lscope = + let lscope_vars = get_all lscope in + hash_list + (fun lscope_var -> + match lscope_var with + | Lvs_let (lv, t) -> 2 * Logic_var.hash lv + 3 * Term.hash t + | Lvs_quantif (lt, lr, lv, rr, rt) -> + 5 * Logic_var.hash lv + + 7 * Term.hash lt + + 11 * Term.hash rt + + 13 * Hashtbl.hash lr + + 17 * Hashtbl.hash rr + | Lvs_formal (lv, li) -> + 19 * Logic_var.hash lv + 23 * Logic_info.hash li + | Lvs_global (lv, t) -> + 29 * Logic_var.hash lv + 31 * Term.hash t + ) + lscope_vars + + let pretty fmt lscope = + let lscope_vars = List.rev lscope in + Format.fprintf fmt "@[[%a]@]" + (Pretty_utils.pp_list ~sep:",@ " pretty_lscope_var) lscope_vars + end) + (* Local Variables: compile-command: "make -C ../../../../.." diff --git a/src/plugins/e-acsl/src/analyses/lscope.mli b/src/plugins/e-acsl/src/analyses/lscope.mli index 56d5707fdaaccdb61ef16d49d46d7883fc7da833..3b3eba63e48cb8908c0b93e46a184c803ada9266 100644 --- a/src/plugins/e-acsl/src/analyses/lscope.mli +++ b/src/plugins/e-acsl/src/analyses/lscope.mli @@ -20,19 +20,15 @@ (* *) (**************************************************************************) -open Cil_types +open Analyses_types (* Handle the logic scope of a term. We define the logic scope of a term [t] to be the set of PURELY logic variables that are bound in [t] in case of use. *) -type lscope_var = - | Lvs_let of logic_var * term (* the expression to which the lv is binded *) - | Lvs_quantif of term * relation * logic_var * relation * term - | Lvs_formal of logic_var * logic_info (* the logic definition *) - | Lvs_global of logic_var * term (* same as Lvs_let *) +type t = lscope -type t +module D: Datatype.S with type t = lscope val empty: t (* Create an empty logic scope. *) @@ -43,12 +39,17 @@ val is_empty: t -> bool val add: lscope_var -> t -> t (* Return a new logic scope in which the given [lscope_var] has been added. *) +val remove: lscope_var -> t -> t +(** @return a new logic scope in which the given [lscope_var] has been removed + if it was present. Use physical equality to check if the [lscope_var] is + present. *) + val get_all: t -> lscope_var list (* Return the list of [lscope_var] of the given logic scope. - The first element is the first [lscope_var] that was added to [t], the - second element is the second [lscope_var] that was added to [t], an so on. *) + The first element is the last [lscope_var] that was added to [t], the + second element is the second to last [lscope_var] that was added to [t], and + so on. *) -type pred_or_term = PoT_pred of predicate | PoT_term of term val is_used: t -> pred_or_term -> bool (* [is_used lscope pot] returns [true] iff [pot] uses a variable from [lscope]. *) diff --git a/src/plugins/e-acsl/src/analyses/memory_tracking.ml b/src/plugins/e-acsl/src/analyses/memory_tracking.ml index dc76e43c7502f4b9620545f9108048f09939b646..6237f181b579e3b38f5488aff9f9ab2e8b3911c1 100644 --- a/src/plugins/e-acsl/src/analyses/memory_tracking.ml +++ b/src/plugins/e-acsl/src/analyses/memory_tracking.ml @@ -25,6 +25,9 @@ open Cil_datatype module Dataflow = Dataflow2 +let dkey = Options.Dkey.mtracking +module Error = Error.Make(struct let phase = dkey end) + let must_never_monitor vi = (* E-ACSL, please do not monitor yourself! *) Rtl.Symbols.mem_vi vi.vname @@ -42,7 +45,6 @@ let must_never_monitor vi = left-values must be tracked by the memory model library *) (* ********************************************************************** *) -let dkey = Options.dkey_analysis module Env: sig val has_heap_allocations: unit -> bool val check_heap_allocations: kernel_function -> unit @@ -219,13 +221,13 @@ module rec Transfer (match lv with | Var vi, _ -> Some vi | Mem e, _ -> base_addr e) - | BinOp((PlusPI | IndexPI | MinusPI), e1, e2, _) -> + | BinOp((PlusPI | MinusPI), e1, e2, _) -> if is_ptr_or_array_exp e1 then base_addr e1 else begin assert (is_ptr_or_array_exp e2); base_addr e2 end - | Info(e, _) | CastE(_, e) -> base_addr e + | CastE(_, e) -> base_addr e | BinOp((MinusPP | PlusA | MinusA | Mult | Div | Mod |Shiftlt | Shiftrt | Lt | Gt | Le | Ge | Eq | Ne | BAnd | BXor | BOr | LAnd | LOr), _, _, _) @@ -271,13 +273,13 @@ module rec Transfer | AddrOf(lhost, _) -> extend_to_expr true state lhost (Cil.new_exp ~loc:e.eloc (Lval lv)), true - | BinOp((PlusPI | IndexPI | MinusPI), e1, e2, _) -> + | BinOp((PlusPI | MinusPI), e1, e2, _) -> if is_ptr_or_array_exp e1 then extend_from_addr state lv e1 else begin assert (is_ptr_or_array_exp e2); extend_from_addr state lv e2 end - | CastE(_, e) | Info(e, _) -> extend_from_addr state lv e + | CastE(_, e) -> extend_from_addr state lv e | _ -> state, false let handle_assignment state (lhost, _ as lv) e = @@ -312,7 +314,7 @@ module rec Transfer | Tif(_, t1, t2) -> let varinfos = register_term kf varinfos t1 in register_term kf varinfos t2 - | TBinOp((PlusPI | IndexPI | MinusPI), t1, t2) -> + | TBinOp((PlusPI | MinusPI), t1, t2) -> (match t1.term_type with | Ctype ty when is_ptr_or_array ty -> register_term kf varinfos t1 | _ -> @@ -729,6 +731,17 @@ let consolidated_must_monitor_vi vi = Env.consolidated_mem vi end +let concurrent_function_ref = ref None + +let abort_because_of_concurrent ~loc vi = + Cil.CurrentLoc.set loc; + Options.abort + ~current:true + "Found concurrent function %a and monitored memory properties.\n\ + Please use option '-e-acsl-concurrency' to add concurrency support." + Printer.pp_varinfo vi + + let must_monitor_vi ?kf ?stmt vi = let _kf = match kf, stmt with | None, None | Some _, _ -> kf @@ -737,26 +750,29 @@ let must_monitor_vi ?kf ?stmt vi = (* [JS 2013/05/07] that is unsound to take the env from the given stmt in presence of aliasing with an address (see tests address.i). TODO: could be optimized though *) - consolidated_must_monitor_vi vi -(* match stmt, kf with - | None, _ -> consolidated_must_monitor_vi vi - | Some _, None -> - assert false - | Some stmt, Some kf -> - if not (Env.is_consolidated ()) then - ignore (consolidated_must_monitor_vi vi); - try - let tbl = Env.find kf in + let res = consolidated_must_monitor_vi vi in + (* match stmt, kf with + | None, _ -> consolidated_must_monitor_vi vi + | Some _, None -> + assert false + | Some stmt, Some kf -> + if not (Env.is_consolidated ()) then + ignore (consolidated_must_monitor_vi vi); try - let set = Stmt.Hashtbl.find tbl stmt in - Varinfo.Hptset.mem vi (Env.default_varinfos set) + let tbl = Env.find kf in + try + let set = Stmt.Hashtbl.find tbl stmt in + Varinfo.Hptset.mem vi (Env.default_varinfos set) + with Not_found -> + (* new statement *) + consolidated_must_monitor_vi vi with Not_found -> - (* new statement *) - consolidated_must_monitor_vi vi - with Not_found -> - (* [kf] is dead code *) - false -*) + (* [kf] is dead code *) + false + *) + match res, !concurrent_function_ref with + | true, Some (loc, vi) -> abort_because_of_concurrent ~loc vi + | _, _ -> res let rec apply_on_vi_base_from_lval f ?kf ?stmt = function | Var vi, _ -> f ?kf ?stmt vi @@ -765,12 +781,12 @@ let rec apply_on_vi_base_from_lval f ?kf ?stmt = function and apply_on_vi_base_from_exp f ?kf ?stmt e = match e.enode with | Lval lv | AddrOf lv | StartOf lv -> apply_on_vi_base_from_lval f ?kf ?stmt lv - | BinOp((PlusPI | IndexPI | MinusPI), e1, _, _) -> + | BinOp((PlusPI | MinusPI), e1, _, _) -> apply_on_vi_base_from_exp f ?kf ?stmt e1 | BinOp(MinusPP, e1, e2, _) -> apply_on_vi_base_from_exp f ?kf ?stmt e1 || apply_on_vi_base_from_exp f ?kf ?stmt e2 - | Info(e, _) | CastE(_, e) -> apply_on_vi_base_from_exp f ?kf ?stmt e + | CastE(_, e) -> apply_on_vi_base_from_exp f ?kf ?stmt e | BinOp((PlusA | MinusA | Mult | Div | Mod |Shiftlt | Shiftrt | Lt | Gt | Le | Ge | Eq | Ne | BAnd | BXor | BOr | LAnd | LOr), _, _, _) | Const _ -> (* possible in case of static address *) false @@ -821,6 +837,14 @@ let use_monitoring () = || Options.Full_mtracking.get () || Env.has_heap_allocations () +let found_concurrent_function ~loc vi = + if use_monitoring () then + abort_because_of_concurrent ~loc vi + else + match !concurrent_function_ref with + | None -> concurrent_function_ref := Some (loc, vi) + | Some _ -> () + (* Local Variables: compile-command: "make -C ../../../../.." diff --git a/src/plugins/e-acsl/src/analyses/memory_tracking.mli b/src/plugins/e-acsl/src/analyses/memory_tracking.mli index 78e29d61eccee59d173472e93c9dabd348844311..4a90e24f50be985bf9297ab59833a57748e989df 100644 --- a/src/plugins/e-acsl/src/analyses/memory_tracking.mli +++ b/src/plugins/e-acsl/src/analyses/memory_tracking.mli @@ -42,6 +42,24 @@ val must_monitor_lval: ?kf:kernel_function -> ?stmt:stmt -> lval -> bool val must_monitor_exp: ?kf:kernel_function -> ?stmt:stmt -> exp -> bool (** Same as {!must_model_vi}, for expressions *) +val found_concurrent_function: loc:location -> varinfo -> unit +(** [found_concurrent_function ~loc fvi] signals to the memory tracking + sub-system that a concurrent function [fvi] has been found at [loc] while + parsing the sources. This function needs only to be called if the + concurrency support of E-ACSL is deactivated. + + If the memory monitoring is in use when a concurrent function is found, + abort the parsing: the user needs to activate the concurrency support. + + Otherwise store the information of the first concurrent function found. + Later if the memory monitoring is used because of memory properties to + verify, then abort the parsing: the user needs to activate the concurrency + support. + + In summary, an analyzed source code can be concurrent with the concurrency + support of E-ACSL deactivated only if no memory properties are to be + verified. *) + (* Local Variables: compile-command: "make -C ../../../../.." diff --git a/src/plugins/e-acsl/src/analyses/typing.ml b/src/plugins/e-acsl/src/analyses/typing.ml index 18ebf2bfe89ffd54989c2ec9ce42d36e10bc8600..f23e7f2d050b547d41689b5c49840c6bf9bb8fc3 100644 --- a/src/plugins/e-acsl/src/analyses/typing.ml +++ b/src/plugins/e-acsl/src/analyses/typing.ml @@ -25,7 +25,8 @@ open Cil_types (* Implement Figure 4 of J. Signoles' JFLA'15 paper "Rester statique pour devenir plus rapide, plus précis et plus mince". *) -let dkey = Options.dkey_typing +let dkey = Options.Dkey.typing +module Error = Error.Make(struct let phase = dkey end) (* In order to properly handle recursive functions the typing method has to store the result of the fixpoint algorithm on intervals before typing @@ -197,9 +198,9 @@ module Memo: sig lenv:Function_params_ty.t -> (term -> computed_info) -> term -> - computed_info Error.or_error + computed_info Error.result val get: lenv:Function_params_ty.t -> term -> - computed_info Error.or_error + computed_info Error.result val clear: unit -> unit end = struct @@ -217,7 +218,7 @@ end = struct the guard and once for encoding [x+1] when incrementing it. The memoization is only useful here and indeed prevent the generation of one extra variable in some cases. *) - let tbl : computed_info Error.or_error Misc.Id_term.Hashtbl.t = + let tbl : computed_info Error.result Misc.Id_term.Hashtbl.t = Misc.Id_term.Hashtbl.create 97 (* The type of the logic function @@ -230,7 +231,7 @@ end = struct We distinguish the calls to the function by storing the type of the arguments corresponding to each call, and we weaken the typing so that it is invariant when the arguments have the same type. *) - let dep_tbl : computed_info Error.or_error Id_term_with_lenv.Hashtbl.t + let dep_tbl : computed_info Error.result Id_term_with_lenv.Hashtbl.t = Id_term_with_lenv.Hashtbl.create 97 let get_dep lenv t = @@ -250,8 +251,8 @@ end = struct try Misc.Id_term.Hashtbl.find tbl t with Not_found -> let x = - try Error.Res (f t) - with Error.Not_yet _ | Error.Typing_error _ as exn -> Error.Err exn + try Result.Ok (f t) + with Error.Not_yet _ | Error.Typing_error _ as exn -> Result.Error exn in Misc.Id_term.Hashtbl.add tbl t x; x @@ -261,8 +262,8 @@ end = struct Id_term_with_lenv.Hashtbl.find dep_tbl (t, lenv) with Not_found -> let x = - try Error.Res (f t) - with Error.Not_yet _ | Error.Typing_error _ as exn -> Error.Err exn + try Result.Ok (f t) + with Error.Not_yet _ | Error.Typing_error _ as exn -> Result.Error exn in Id_term_with_lenv.Hashtbl.add dep_tbl (t, lenv) x; x @@ -542,7 +543,7 @@ let rec type_term ignore (type_term ~use_gmp_opt:true ~ctx:Nan ~lenv t); dup Nan - | TBinOp ((PlusPI | IndexPI | MinusPI), t1, t2) -> + | TBinOp ((PlusPI | MinusPI), t1, t2) -> (* both [t1] and [t2] must be typed. *) ignore (type_term ~use_gmp_opt:true ~ctx:Nan ~lenv t1); let ctx = type_offset t2 in @@ -688,8 +689,8 @@ let rec type_term | Some ctx -> coerce ~arith_operand ~ctx ~op ty) t with - | Res res -> res - | Err exn -> raise exn + | Result.Ok res -> res + | Result.Error exn -> raise exn and type_term_lval ~lenv (host, offset) = type_term_lhost ~lenv host; @@ -882,6 +883,7 @@ and type_predicate ~lenv p = "preprocessing of quantified predicate" Bound_variables.get_preprocessed_quantifier p + Printer.pp_predicate in let guards = List.map @@ -938,9 +940,9 @@ let unsafe_set t ?ctx ~lenv ty = (******************************************************************************) let get_number_ty ~lenv t = - (Error.retrieve_preprocessing "typing" (Memo.get ~lenv) t).ty + (Error.retrieve_preprocessing "typing" (Memo.get ~lenv) t Printer.pp_term).ty let get_integer_op ~lenv t = - (Error.retrieve_preprocessing "typing" (Memo.get ~lenv) t).op + (Error.retrieve_preprocessing "typing" (Memo.get ~lenv) t Printer.pp_term).op let get_integer_op_of_predicate ~lenv p = (type_predicate ~lenv p).op (* {!typ_of_integer}, but handle the not-integer cases. *) @@ -956,15 +958,18 @@ let extract_typ t ty = | Larrow _ -> Error.not_yet "unsupported logic type: type arrow" let get_typ ~lenv t = - let info = Error.retrieve_preprocessing "typing" (Memo.get ~lenv) t in + let info = + Error.retrieve_preprocessing "typing" (Memo.get ~lenv) t Printer.pp_term in extract_typ t info.ty let get_op ~lenv t = - let info = Error.retrieve_preprocessing "typing" (Memo.get ~lenv) t in + let info = + Error.retrieve_preprocessing "typing" (Memo.get ~lenv) t Printer.pp_term in extract_typ t info.op let get_cast ~lenv t = - let info = Error.retrieve_preprocessing "typing" (Memo.get ~lenv) t in + let info = + Error.retrieve_preprocessing "typing" (Memo.get ~lenv) t Printer.pp_term in try Option.map typ_of_number_ty info.cast with Not_a_number -> None diff --git a/src/plugins/e-acsl/src/code_generator/assert.ml b/src/plugins/e-acsl/src/code_generator/assert.ml index c512bfa64bca2b89a9bf5e0a1c367a5555e8fc32..2321d56a757a74b949cb501e0ee961096daf2f61 100644 --- a/src/plugins/e-acsl/src/code_generator/assert.ml +++ b/src/plugins/e-acsl/src/code_generator/assert.ml @@ -84,13 +84,13 @@ let with_data_from ~loc kf env from = "assert_copy_values" [ adata.data_ptr; from.data_ptr ] in - Env.add_stmt env kf stmt + Env.add_stmt env stmt else env in Some { adata with data_registered = from.data_registered }, env | None -> None, env -let merge_right ~loc kf env adata1 adata2 = +let merge_right ~loc env adata1 adata2 = match adata1, adata2 with | Some adata1, Some adata2 when adata1.data_registered -> let stmt = @@ -103,16 +103,16 @@ let merge_right ~loc kf env adata1 adata2 = { adata2 with data_registered = true } in - let env = Env.add_stmt env kf stmt in + let env = Env.add_stmt env stmt in Some adata2, env | Some _, Some adata | None, Some adata -> Some adata, env | Some _, None | None, None -> None, env -let clean ~loc kf env adata = +let clean ~loc env adata = match adata with | Some { data_registered; data_ptr } when data_registered-> let clean_stmt = Smart_stmt.rtl_call ~loc "assert_clean" [ data_ptr ] in - Env.add_stmt env kf clean_stmt + Env.add_stmt env clean_stmt | Some _ | None -> env @@ -130,7 +130,7 @@ let ikind_to_string = function | ILongLong -> "longlong" | IULongLong -> "ulonglong" -let do_register_data ~loc kf env { data_ptr } name e = +let do_register_data ~loc env { data_ptr } name e = let ty = Cil.typeOf e in let fct, args = if Gmp_types.Z.is_t ty then @@ -160,9 +160,9 @@ let do_register_data ~loc kf env { data_ptr } name e = let name = Cil.mkString ~loc name in let args = data_ptr :: name :: args in let stmt = Smart_stmt.rtl_call ~loc fct args in - Env.add_stmt env kf stmt + Env.add_stmt env stmt -let register ~loc kf env ?(force=false) name e adata = +let register ~loc env ?(force=false) name e adata = if Options.Assert_print_data.get () then match adata, e.enode with | Some adata, Const _ when not force -> @@ -176,23 +176,23 @@ let register ~loc kf env ?(force=false) name e adata = Some adata, env | Some adata, _ -> let adata = { adata with data_registered = true } in - Some adata, do_register_data ~loc kf env adata name e + Some adata, do_register_data ~loc env adata name e | None, _ -> None, env else adata, env -let register_term ~loc kf env ?force t e adata = +let register_term ~loc env ?force t e adata = let name = Format.asprintf "@[%a@]" Printer.pp_term t in - register ~loc kf env name ?force e adata + register ~loc env name ?force e adata -let register_pred ~loc kf env ?force p e adata = +let register_pred ~loc env ?force p e adata = if Env.annotation_kind env == Smart_stmt.RTE then (* When translating RTE, we do not want to print the result of the predicate because they should be the only predicate in an assertion clause. *) adata, env else let name = Format.asprintf "@[%a@]" Printer.pp_predicate p in - register ~loc kf env name ?force e adata + register ~loc env name ?force e adata let kind_to_string loc k = Cil.mkString diff --git a/src/plugins/e-acsl/src/code_generator/assert.mli b/src/plugins/e-acsl/src/code_generator/assert.mli index 016e4830271ab0dbd7831b75263b028649309488..d81ed28c982d1fe1ac45c66cb85e13326ed4b61b 100644 --- a/src/plugins/e-acsl/src/code_generator/assert.mli +++ b/src/plugins/e-acsl/src/code_generator/assert.mli @@ -46,55 +46,52 @@ val with_data_from: loc:location -> kernel_function -> Env.t -> t -> t * Env.t If [from] is a "no data" assertion context, then the new context is also a "no data" assertion context. *) -val merge_right: loc:location -> kernel_function -> Env.t -> t -> t -> t * Env.t -(** [merge_right ~loc kf env adata1 adata2] merges the assertion data of - [adata1] into [adata2] if [adata2] is not a "no data" assertion context. *) +val merge_right: loc:location -> Env.t -> t -> t -> t * Env.t +(** [merge_right ~loc env adata1 adata2] merges the assertion data of [adata1] + into [adata2] if [adata2] is not a "no data" assertion context. *) -val clean: loc:location -> kernel_function -> Env.t -> t -> Env.t -(** [clean ~loc kf env adata] generates a call to the C cleanup function for the +val clean: loc:location -> Env.t -> t -> Env.t +(** [clean ~loc env adata] generates a call to the C cleanup function for the assertion context. This function *must* be used if the assertion context is not given to [runtime_check] or [runtime_check_with_msg], otherwise the memory allocated in the C structure will not be freed. *) val register: loc:location -> - kernel_function -> Env.t -> ?force:bool -> string -> exp -> t -> t * Env.t -(** [register ~loc kf env ?force name e adata] registers the data [e] - corresponding to the name [name] to the assertion context [adata]. +(** [register ~loc env ?force name e adata] registers the data [e] corresponding + to the name [name] to the assertion context [adata]. If [force] is false (default), the data is not registered if the expression is a constant. If [force] is true, the data is registered even if the expression is a constant. *) val register_term: loc:location -> - kernel_function -> Env.t -> ?force:bool -> term -> exp -> t -> t * Env.t -(** [register_term ~loc kf env ?force t e adata] registers the data [e] +(** [register_term ~loc env ?force t e adata] registers the data [e] corresponding to the term [t] to the assertion context [adata]. The parameter [force] has the same signification than for the function [register]. *) val register_pred: loc:location -> - kernel_function -> Env.t -> ?force:bool -> predicate -> exp -> t -> t * Env.t -(** [register_pred ~loc kf env ?force p e adata] registers the data [e] +(** [register_pred ~loc env ?force p e adata] registers the data [e] corresponding to the predicate [p] to the assertion context [adata]. The parameter [force] has the same signification than for the function [register]. *) diff --git a/src/plugins/e-acsl/src/code_generator/at_with_lscope.ml b/src/plugins/e-acsl/src/code_generator/at_with_lscope.ml index d5e5e2dd5649cbd2d79f790c84389f93460d2bf4..674db880444e18115a40915d30826b1f76888979 100644 --- a/src/plugins/e-acsl/src/code_generator/at_with_lscope.ml +++ b/src/plugins/e-acsl/src/code_generator/at_with_lscope.ml @@ -21,6 +21,7 @@ (**************************************************************************) open Cil_types +open Analyses_types (**************************************************************************) (********************** Forward references ********************************) @@ -85,10 +86,10 @@ let rec sizes_and_shifts_from_quantifs ~loc kf lscope sizes_and_shifts = match lscope with | [] -> sizes_and_shifts - | Lscope.Lvs_quantif(tmin, _, _, _, tmax) ::_ + | Lvs_quantif(tmin, _, _, _, tmax) ::_ when Misc.term_has_lv_from_vi tmin || Misc.term_has_lv_from_vi tmax -> Error.not_yet "\\at with logic variable linked to C variable" - | Lscope.Lvs_quantif(tmin, rel1, lv, rel2, tmax) :: lscope' -> + | Lvs_quantif(tmin, rel1, lv, rel2, tmax) :: lscope' -> let t_size = Logic_const.term ~loc (TBinOp(MinusA, tmax, tmin)) Linteger in let t_size = match rel1, rel2 with | Rle, Rle -> @@ -146,14 +147,14 @@ let rec sizes_and_shifts_from_quantifs ~loc kf lscope sizes_and_shifts = (* Returning *) let sizes_and_shifts = (t_size, t_shifted) :: sizes_and_shifts in sizes_and_shifts_from_quantifs ~loc kf lscope' sizes_and_shifts - | (Lscope.Lvs_let(_, t) | Lscope.Lvs_global(_, t)) :: _ + | (Lvs_let(_, t) | Lvs_global(_, t)) :: _ when Misc.term_has_lv_from_vi t -> Error.not_yet "\\at with logic variable linked to C variable" - | Lscope.Lvs_let _ :: lscope' -> + | Lvs_let _ :: lscope' -> sizes_and_shifts_from_quantifs ~loc kf lscope' sizes_and_shifts - | Lscope.Lvs_formal _ :: _ -> + | Lvs_formal _ :: _ -> Error.not_yet "\\at using formal variable of a logic function" - | Lscope.Lvs_global _ :: _ -> + | Lvs_global _ :: _ -> Error.not_yet "\\at using global logic variable" let size_from_sizes_and_shifts ~loc = function @@ -235,14 +236,15 @@ let put_block_at_label env kf block label = let to_exp ~loc kf env pot label = let term_to_exp = !term_to_exp_ref in let lscope_vars = Lscope.get_all (Env.Logic_scope.get env) in + let lscope_vars = List.rev lscope_vars in let sizes_and_shifts = sizes_and_shifts_from_quantifs ~loc kf lscope_vars [] in (* Creating the pointer *) let ty = match pot with - | Lscope.PoT_pred _ -> + | PoT_pred _ -> Cil.intType - | Lscope.PoT_term t -> + | PoT_term t -> let lenv = (Env.Local_vars.get env) in begin match Typing.get_number_ty ~lenv t with | Typing.(C_integer _ | C_float _ | Nan) -> @@ -310,7 +312,7 @@ let to_exp ~loc kf env pot label = let term_to_exp = !term_to_exp_ref ~adata:Assert.no_data in let named_predicate_to_exp = !predicate_to_exp_ref ~adata:Assert.no_data in match pot with - | Lscope.PoT_pred p -> + | PoT_pred p -> let env = Env.push env in let lval, env = lval_at_index ~loc kf env (e_at, vi_at, t_index) in let e, _, env = named_predicate_to_exp kf env p in @@ -324,7 +326,7 @@ let to_exp ~loc kf env pot label = (* We CANNOT return [block.bstmts] because it does NOT contain variable declarations. *) [ Smart_stmt.block_stmt block ], env - | Lscope.PoT_term t -> + | PoT_term t -> begin match Typing.get_number_ty ~lenv:(Env.Local_vars.get env) t with | Typing.(C_integer _ | C_float _ | Nan) -> let env = Env.push env in @@ -348,6 +350,7 @@ let to_exp ~loc kf env pot label = in (* Storing loops *) let lscope_vars = Lscope.get_all (Env.Logic_scope.get env) in + let lscope_vars = List.rev lscope_vars in let env = Env.push env in let storing_loops_stmts, env = Loops.mk_nested_loops ~loc mk_innermost_block kf env lscope_vars diff --git a/src/plugins/e-acsl/src/code_generator/at_with_lscope.mli b/src/plugins/e-acsl/src/code_generator/at_with_lscope.mli index 2f23c959c3ec89aaf8425b8d7f9ccf239c409c7f..989404e5a2b5a37d99db7b89b8c3a16f4d9a172d 100644 --- a/src/plugins/e-acsl/src/code_generator/at_with_lscope.mli +++ b/src/plugins/e-acsl/src/code_generator/at_with_lscope.mli @@ -22,6 +22,7 @@ open Cil_types open Cil_datatype +open Analyses_types (* Convert \at on terms or predicates in which we can find purely logic variable. *) @@ -32,7 +33,7 @@ open Cil_datatype val to_exp: loc:Location.t -> kernel_function -> Env.t -> - Lscope.pred_or_term -> logic_label -> exp * Env.t + pred_or_term -> logic_label -> exp * Env.t (*****************************************************************************) (**************************** Handling memory ********************************) diff --git a/src/plugins/e-acsl/src/code_generator/contract.ml b/src/plugins/e-acsl/src/code_generator/contract.ml index df7029c708d9f9bd2c0600a1395fa0e8ea961d44..69d7b48a5e6034bc13368eb23ce15ea6384c1a8c 100644 --- a/src/plugins/e-acsl/src/code_generator/contract.ml +++ b/src/plugins/e-acsl/src/code_generator/contract.ml @@ -22,6 +22,7 @@ open Cil_types open Contract_types +module Error = Translation_error (**************************************************************************) (********************** Contract ********************************) @@ -37,7 +38,7 @@ module Rtl_call: sig (** Call the C function [__e_acsl_contract_init] *) val cleanup: - loc:location -> Env.t -> kernel_function -> exp -> Env.t + loc:location -> Env.t -> exp -> Env.t (** Call the C function [__e_acsl_contract_cleanup] *) val set_assumes: @@ -46,17 +47,15 @@ module Rtl_call: sig (** Call the C function [__e_acsl_contract_set_behavior_assumes] *) val get_assumes: - loc:location -> result:varinfo -> Env.t -> kernel_function -> exp -> int -> - Env.t + loc:location -> result:varinfo -> Env.t -> exp -> int -> Env.t (** Call the C function [__e_acsl_contract_get_behavior_assumes] *) val partial_count_behaviors: - loc:location -> result:varinfo -> Env.t -> kernel_function -> exp -> - int list -> Env.t + loc:location -> result:varinfo -> Env.t -> exp -> int list -> Env.t (** Call the C function [__e_acsl_contract_partial_count_behaviors] *) val partial_count_all_behaviors: - loc:location -> result:varinfo -> Env.t -> kernel_function -> exp -> Env.t + loc:location -> result:varinfo -> Env.t -> exp -> Env.t (** Call the C function [__e_acsl_contract_partial_count_all_behaviors] *) end = struct @@ -87,10 +86,9 @@ end = struct init_function_name [count_e] ]) - let cleanup ~loc env kf contract = + let cleanup ~loc env contract = Env.add_stmt env - kf (Smart_stmt.rtl_call ~loc "contract_clean" @@ -107,25 +105,23 @@ end = struct in Env.add_stmt env - kf (Smart_stmt.rtl_call ~loc "contract_set_behavior_assumes" [contract; idx_e; assumes_e]) - let get_assumes ~loc ~result env kf contract idx = + let get_assumes ~loc ~result env contract idx = let idx_e = Cil.integer ~loc idx in let result = Cil.var result in Env.add_stmt env - kf (Smart_stmt.rtl_call ~loc ~result "contract_get_behavior_assumes" [contract; idx_e]) - let partial_count_behaviors ~loc ~result env kf contract idxes = + let partial_count_behaviors ~loc ~result env contract idxes = let idxes, count = List.fold_right (fun idx (idxes, count) -> @@ -136,18 +132,16 @@ end = struct let result = Cil.var result in Env.add_stmt env - kf (Smart_stmt.rtl_call ~loc ~result "contract_partial_count_behaviors" (contract :: Cil.integer ~loc count :: idxes)) - let partial_count_all_behaviors ~loc ~result env kf contract = + let partial_count_all_behaviors ~loc ~result env contract = let result = Cil.var result in Env.add_stmt env - kf (Smart_stmt.rtl_call ~loc ~result @@ -213,12 +207,12 @@ let init kf env contract = else env (** Cleanup the C API for the given contract *) -let cleanup kf env contract = +let cleanup env contract = match contract.var with | None -> env | Some (_, e) -> let loc = contract.location in - Rtl_call.cleanup ~loc env kf e + Rtl_call.cleanup ~loc env e (** Retrieve the behavior index from its name for the given contract *) let get_bhvr_idx contract bhvr_name = @@ -314,7 +308,8 @@ let fold_left_handle_error_with_args f (env, acc) l = (** Insert requires check for the default behavior of the given contract in the environment. *) -let check_default_requires kf kinstr env contract = +let check_default_requires kf env contract = + let kinstr = Env.get_kinstr env in let default_behavior = Cil.find_default_behavior contract.spec in @@ -336,10 +331,11 @@ let check_default_requires kf kinstr env contract = (** Insert requires check for the behaviors other than the default behavior of the given contract in the environment *) -let check_other_requires kf kinstr env contract = +let check_other_requires kf env contract = let get_or_create_assumes_var = mk_get_or_create_var kf Cil.intType "assumes_value" in + let kinstr = Env.get_kinstr env in let do_behavior env b = if Cil.is_default_behavior b then env @@ -419,12 +415,11 @@ let check_other_requires kf kinstr env contract = ~loc ~result:assumes_vi env - kf contract_e idx in let stmt = Smart_stmt.if_stmt ~loc ~cond:assumes_e requires_blk in - Env.add_stmt env kf stmt + Env.add_stmt env stmt in List.fold_left do_behavior @@ -439,7 +434,8 @@ type translate_ppt = (** For each set of behavior names in [clauses], [check_active_behaviors] counts the number of active behaviors and creates assertions for the [ppt_to_translate]. *) -let check_active_behaviors ~ppt_to_translate ~get_or_create_var kf kinstr env contract clauses = +let check_active_behaviors ~ppt_to_translate ~get_or_create_var kf env contract clauses = + let kinstr = Env.get_kinstr env in let loc = contract.location in Cil.CurrentLoc.set loc; let do_clause env bhvrs = @@ -473,7 +469,6 @@ let check_active_behaviors ~ppt_to_translate ~get_or_create_var kf kinstr env co ~loc ~result:vi env - kf contract_e in let complete_msg = "all behaviors complete" in @@ -494,7 +489,6 @@ let check_active_behaviors ~ppt_to_translate ~get_or_create_var kf kinstr env co ~loc ~result:vi env - kf contract_e args in @@ -516,7 +510,6 @@ let check_active_behaviors ~ppt_to_translate ~get_or_create_var kf kinstr env co let adata, env = Assert.register ~loc - kf env "number of active behaviors" active_bhvrs_e @@ -540,16 +533,15 @@ let check_active_behaviors ~ppt_to_translate ~get_or_create_var kf kinstr env co for the given clause *) Env.add_stmt env - kf (Smart_stmt.if_stmt ~loc ~cond:(Cil.mkBinOp ~loc Ne active_bhvrs_e (Cil.one ~loc)) (Cil.mkBlock [ assert_complete_stmt; assert_disjoint_stmt ])) (* Otherwise just get the corresponding assertion *) else if must_translate_complete then - Env.add_stmt env kf assert_complete_stmt + Env.add_stmt env assert_complete_stmt else if must_translate_disjoint then - Env.add_stmt env kf assert_disjoint_stmt + Env.add_stmt env assert_disjoint_stmt else (* By construction, at least either [must_translate_complete] or [must_translate_disjoint] is true *) @@ -562,7 +554,7 @@ let check_active_behaviors ~ppt_to_translate ~get_or_create_var kf kinstr env co (** Insert complete and disjoint behaviors check for the given contract in the environement *) -let check_complete_and_disjoint kf kinstr env contract = +let check_complete_and_disjoint kf env contract = (* Only translate the complete and disjoint clauses if all the assumes clauses could be translated *) if contract.all_assumes_translated then @@ -610,7 +602,6 @@ let check_complete_and_disjoint kf kinstr env contract = ~ppt_to_translate ~get_or_create_var kf - kinstr env contract bhvrs @@ -629,10 +620,11 @@ let check_complete_and_disjoint kf kinstr env contract = end (** Insert ensures check for the given contract in the environement *) -let check_post_conds kf kinstr env contract = +let check_post_conds kf env contract = let get_or_create_assumes_var = mk_get_or_create_var kf Cil.intType "assumes_value" in + let kinstr = Env.get_kinstr env in let do_behavior env b = let env = Env.handle_error @@ -750,26 +742,25 @@ let check_post_conds kf kinstr env contract = ~loc ~result:assumes_vi env - kf contract_e idx in let stmt = Smart_stmt.if_stmt ~loc ~cond:assumes_e post_cond_blk in - Env.add_stmt env kf stmt + Env.add_stmt env stmt in List.fold_left do_behavior env contract.spec.spec_behavior -let translate_preconditions kf kinstr env contract = +let translate_preconditions kf env contract = let env = Env.set_annotation_kind env Smart_stmt.Precondition in let env = Env.push_contract env contract in let env = init kf env contract in (* Start with translating the requires predicate of the default behavior. *) let env = Env.handle_error - (fun env -> check_default_requires kf kinstr env contract) + (fun env -> check_default_requires kf env contract) env in (* Then setup the assumes clauses of the contract. *) @@ -777,18 +768,18 @@ let translate_preconditions kf kinstr env contract = (* And finally translate the requires predicates of the rest of the behaviors, skipping over the default behavior. *) let do_it env = - let env = check_other_requires kf kinstr env contract in - let env = check_complete_and_disjoint kf kinstr env contract in + let env = check_other_requires kf env contract in + let env = check_complete_and_disjoint kf env contract in env in Env.handle_error do_it env -let translate_postconditions kf kinstr env = +let translate_postconditions kf env = let env = Env.set_annotation_kind env Smart_stmt.Postcondition in let contract, env = Env.pop_and_get_contract env in let do_it env = - let env = check_post_conds kf kinstr env contract in + let env = check_post_conds kf env contract in env in let env = Env.handle_error do_it env in - cleanup kf env contract + cleanup env contract diff --git a/src/plugins/e-acsl/src/code_generator/contract.mli b/src/plugins/e-acsl/src/code_generator/contract.mli index d9db3d14ae98b26aabfa28db85446595b90912c8..8dc2a3a21df5cbc5cb33068721f44f5b412a205c 100644 --- a/src/plugins/e-acsl/src/code_generator/contract.mli +++ b/src/plugins/e-acsl/src/code_generator/contract.mli @@ -32,8 +32,8 @@ val create: loc:location -> spec -> t (** Create a contract from a [spec] object (either function spec or statement spec) *) -val translate_preconditions: kernel_function -> kinstr -> Env.t -> t -> Env.t +val translate_preconditions: kernel_function -> Env.t -> t -> Env.t (** Translate the preconditions of the given contract into the environement *) -val translate_postconditions: kernel_function -> kinstr -> Env.t -> Env.t +val translate_postconditions: kernel_function -> Env.t -> Env.t (** Translate the postconditions of the given contract into the environment *) diff --git a/src/plugins/e-acsl/src/code_generator/env.ml b/src/plugins/e-acsl/src/code_generator/env.ml index 728c432a7c01a973e51aff0d881a7867021d227f..a0c70db9491df461646aebfd4ea4adb80900157d 100644 --- a/src/plugins/e-acsl/src/code_generator/env.ml +++ b/src/plugins/e-acsl/src/code_generator/env.ml @@ -24,6 +24,7 @@ module E_acsl_label = Label open Cil_types open Cil_datatype open Contract_types +module Error = Translation_error type localized_scope = | LGlobal @@ -76,8 +77,10 @@ type t = { (* list of loop environment for each currently visited loops *) cpt: int; (* counter used when generating variables *) - local_vars: Typing.Function_params_ty.t list + local_vars: Typing.Function_params_ty.t list; (* type of variables used in calls to logic functions and predicates *) + kinstr: kinstr; + (* Current kinstr of the environment *) } let empty_block = @@ -109,7 +112,8 @@ let empty = var_mapping = Logic_var.Map.empty; loop_envs = []; cpt = 0; - local_vars = [] } + local_vars = []; + kinstr = Kglobal } let top env = match env.env_stack with | [] -> Options.fatal "Empty environment. That is unexpected." @@ -159,7 +163,7 @@ let pop_loop env = (** {2 RTEs} *) (* ************************************************************************** *) -let rte env b = +let set_rte env b = let local_env, tl_env = top env in { env with env_stack = { local_env with rte = b } :: tl_env } @@ -167,19 +171,15 @@ let generate_rte env = let local_env, _ = top env in local_env.rte -let with_rte ~f env rte_value = - let old_rte_value = generate_rte env in - let env = rte env rte_value in - let env = f env in - let env = rte env old_rte_value in - env +(* ************************************************************************** *) +(** {2 Kinstr} *) +(* ************************************************************************** *) -let with_rte_and_result ~f env rte_value = - let old_rte_value = generate_rte env in - let env = rte env rte_value in - let other, env = f env in - let env = rte env old_rte_value in - other, env +let set_kinstr env kinstr = + { env with kinstr = kinstr } + +let get_kinstr env = + env.kinstr (* ************************************************************************** *) @@ -375,6 +375,7 @@ end module Logic_scope = struct let get env = env.lscope let extend env lvs = { env with lscope = Lscope.add lvs env.lscope } + let remove env lvs = { env with lscope = Lscope.remove lvs env.lscope } let set_reset env bool = { env with lscope_reset = bool } let get_reset env = env.lscope_reset let reset env = @@ -385,9 +386,7 @@ end let add_assert kf stmt annot = Annotations.add_assert Options.emitter ~kf stmt annot -let add_stmt ?(post=false) ?before env kf stmt = - if not post then - Option.iter (fun old -> E_acsl_label.move kf ~old stmt) before; +let add_stmt ?(post=false) env stmt = let local_env, tl = top env in let block = local_env.block_info in let block = @@ -400,6 +399,7 @@ let add_stmt ?(post=false) ?before env kf stmt = { env with env_stack = local_env :: tl } let extend_stmt_in_place env stmt ~label block = + let stmt = E_acsl_label.get_first_inner_stmt stmt in let new_stmt = Smart_stmt.block_stmt block in let sk = stmt.skind in stmt.skind <- Block (Cil.mkBlock [ new_stmt; Smart_stmt.stmt sk ]); @@ -591,6 +591,41 @@ let pop_contract env = let _, env = pop_and_get_contract env in env +(* ************************************************************************** *) +(** {2 Utilities} *) +(* ************************************************************************** *) + +let with_params_and_result ?rte ?kinstr ~f env = + let old_rte, env = + match rte with + | Some rte -> + Some (generate_rte env), set_rte env rte + | None -> None, env + in + let old_kinstr, env = + match kinstr with + | Some kinstr -> + Some (get_kinstr env), set_kinstr env kinstr + | None -> None, env + in + let other, env = f env in + let env = + match old_kinstr with + | Some kinstr -> set_kinstr env kinstr + | None -> env + in + let env = + match old_rte with + | Some rte -> set_rte env rte + | None -> env + in + other, env + +let with_params ?rte ?kinstr ~f env = + let (), env = + with_params_and_result ?rte ?kinstr ~f:(fun env -> (), f env) env + in + env (* debugging purpose *) let pretty fmt env = diff --git a/src/plugins/e-acsl/src/code_generator/env.mli b/src/plugins/e-acsl/src/code_generator/env.mli index 22101128c078bb92b59e976952a9c42d0edd217e..7805d06efcbe286ba61395b913d3586fb98ff4f7 100644 --- a/src/plugins/e-acsl/src/code_generator/env.mli +++ b/src/plugins/e-acsl/src/code_generator/env.mli @@ -21,6 +21,7 @@ (**************************************************************************) open Cil_types +open Analyses_types open Contract_types (** Environments. @@ -89,12 +90,9 @@ val add_assert: kernel_function -> stmt -> predicate -> unit (** [add_assert env s p] associates the assertion [p] to the statement [s] in the environment [env]. *) -val add_stmt: ?post:bool -> ?before:stmt -> t -> kernel_function -> stmt -> t +val add_stmt: ?post:bool -> t -> stmt -> t (** [add_stmt env s] extends [env] with the new statement [s]. - [before] may define which stmt the new one is included before. This is to - say that any labels attached to [before] are moved to [stmt]. [post] - indicates that [stmt] should be added after the target statement. - [before] and [post] are mutually exclusive. *) + [post] indicates that [stmt] should be added after the target statement. *) val extend_stmt_in_place: t -> stmt -> label:logic_label -> block -> t (** [extend_stmt_in_place env stmt ~label b] modifies [stmt] in place in @@ -129,10 +127,14 @@ module Logic_scope: sig val get: t -> Lscope.t (** Return the logic scope associated to the environment. *) - val extend: t -> Lscope.lscope_var -> t + val extend: t -> lscope_var -> t (** Add a new logic variable with its associated information in the logic scope of the environment. *) + val remove: t -> lscope_var -> t + (** Remove a logic variable and its associated information from the logic + scope of the environment. *) + val reset: t -> t (** Return a new environment in which the logic scope is reset iff [set_reset _ true] has been called beforehand. Do nothing otherwise. *) @@ -168,28 +170,12 @@ val pop_loop: t -> t (** {2 RTEs} *) (* ************************************************************************** *) -val rte: t -> bool -> t -(** [rte env x] sets RTE generation to x for the given environment *) +val set_rte: t -> bool -> t +(** [set_rte env x] sets RTE generation to x for the given environment *) val generate_rte: t -> bool (** Returns the current value of RTE generation for the given environment *) -val with_rte: f:(t -> t) -> t -> bool -> t -(** [with_rte ~f env x] executes the given closure with RTE generation set to x, - and reset RTE generation to its original value afterwards. - This function does not handle exceptions at all. The user must handle them - either directly in the [f] closure or around the call to the function. *) - -val with_rte_and_result: f:(t -> 'a * t) -> t -> bool -> 'a * t -(** [with_rte_and_result ~f env x] executes the given closure with RTE - generation set to x, and reset RTE generation to its original value - afterwards. [f] is a closure that takes an environment an returns a pair - where the first member is an arbitrary value and the second member is the - environment. The function will return the first member of the returned pair - of the closure along with the updated environment. - This function does not handle exceptions at all. The user must handle them - either directly in the [f] closure or around the call to the function. *) - module Local_vars: sig val push_new: t -> t val add: t -> Typing.number_ty -> t @@ -222,6 +208,13 @@ val not_yet: t -> string -> 'a val untypable: t -> string -> 'a (** Save the current context and raise [Error.Typing_error] exception. *) +(* ************************************************************************** *) +(** {2 Current environment kinstr} *) +(* ************************************************************************** *) + +val set_kinstr: t -> kinstr -> t +val get_kinstr: t -> kinstr + (* ************************************************************************** *) (** {2 Contracts} *) (* ************************************************************************** *) @@ -235,6 +228,31 @@ val pop_and_get_contract: t -> contract * t val pop_contract: t -> t (** Pop the top contract of the environment's stack *) +(* ************************************************************************** *) +(** {2 Utilities} *) +(* ************************************************************************** *) + +val with_params: ?rte:bool -> ?kinstr:kinstr -> f:(t -> t) -> t -> t +(** [with_params ~rte ~kinstr ~f env] executes the given closure with the given + environment after having set RTE generation to [rte] and current kinstr to + [kinstr]. + [f] is a closure that takes an environment and returns an environment. + The environment returned by the closure is updated to restore the RTE + generation and kinstr attributes to the values of the original environment, + then is returned. *) + +val with_params_and_result: + ?rte:bool -> ?kinstr:kinstr -> f:(t -> 'a * t) -> t -> 'a * t +(** [with_params_and_result ~rte ~kinstr ~f env] executes the given closure with + the given environment after having set RTE generation to [rte] and current + kinstr to [kinstr]. + [f] is a closure that takes an environment and returns a pair where the + first member is an arbitrary value and the second member is the environment. + The environment returned by the closure is updated to restore the RTE + generation and kinstr attributes to the values of the original environment, + then the function returns the arbitrary value returned by the closure along + with the updated environment. *) + val pretty: Format.formatter -> t -> unit (* diff --git a/src/plugins/e-acsl/src/code_generator/gmp.ml b/src/plugins/e-acsl/src/code_generator/gmp.ml index ff03f6e50bff630778283cb9a8c5b9396ee27880..bda936cba38519ccb159ba03b09ad4ab6fef55c4 100644 --- a/src/plugins/e-acsl/src/code_generator/gmp.ml +++ b/src/plugins/e-acsl/src/code_generator/gmp.ml @@ -21,6 +21,7 @@ (**************************************************************************) open Cil_types +module Error = Translation_error (**************************************************************************) (************************* Calls to builtins ******************************) @@ -46,7 +47,7 @@ let name_of_mpz_arith_bop = function | BXor -> "__gmpz_xor" | Shiftlt -> "__gmpz_mul_2exp" | Shiftrt -> "__gmpz_tdiv_q_2exp" - | Lt | Gt | Le | Ge | Eq | Ne | LAnd | LOr | PlusPI | IndexPI | MinusPI + | Lt | Gt | Le | Ge | Eq | Ne | LAnd | LOr | PlusPI | MinusPI | MinusPP as bop -> Options.fatal "Operation '%a' either not arithmetic or not supported on GMP integers" diff --git a/src/plugins/e-acsl/src/code_generator/injector.ml b/src/plugins/e-acsl/src/code_generator/injector.ml index 1ed98db412af31123e386f09d3df7fe5b1d9952e..0870eb32d4fe2b820344fee2229b2849eb0d786b 100644 --- a/src/plugins/e-acsl/src/code_generator/injector.ml +++ b/src/plugins/e-acsl/src/code_generator/injector.ml @@ -20,11 +20,11 @@ (* *) (**************************************************************************) -module E_acsl_label = Label (* [Label] is hidden when opening [Cil_datatype *) open Cil_types open Cil_datatype +module Error = Translation_error -let dkey = Options.dkey_translation +let dkey = Options.Dkey.translation (* ************************************************************************** *) (* Expressions *) @@ -49,19 +49,39 @@ let replace_literal_strings_in_args env kf_opt (* None for globals *) args = RTL. *) let rename_caller ~loc caller args = if Options.Replace_libc_functions.get () - && Functions.RTL.has_rtl_replacement caller.vorig_name then begin + && Functions.Libc.has_replacement caller.vorig_name then begin (* rewrite names of functions for which we have alternative definitions in the RTL. *) - let fvi = Rtl.Symbols.libc_replacement caller in + let fvi = + Rtl.Symbols.replacement + ~get_name:Functions.Libc.replacement_name + caller + in fvi, args end + else if Functions.Concurrency.has_replacement caller.vorig_name then + if Options.Concurrency.get () then + let fvi = + Rtl.Symbols.replacement + ~get_name:Functions.Concurrency.replacement_name + caller + in + fvi, args + else begin + Memory_tracking.found_concurrent_function ~loc caller; + caller, args + end else if Options.Validate_format_strings.get () && Functions.Libc.is_printf_name caller.vorig_name then (* rewrite names of format functions (such as printf). This case differs from the above because argument list of format functions is extended with an argument describing actual variadic arguments *) (* replacement name, e.g., [printf] -> [__e_acsl_builtin_printf] *) - let fvi = Rtl.Symbols.libc_replacement caller in + let fvi = + Rtl.Symbols.replacement + ~get_name:Functions.Libc.replacement_name + caller + in let fmt = Functions.Libc.get_printf_argument_str ~loc caller.vorig_name args in @@ -88,12 +108,12 @@ let rec inject_in_init env kf_opt vi off = function in CompoundInit(typ, List.rev l), env -let inject_in_local_init ~loc ~stmt env kf vi = function +let inject_in_local_init ~loc env kf vi = function | ConsInit (fvi, sz :: _, _) as init when Functions.Libc.is_vla_alloc_name fvi.vname -> (* add a store statement when creating a variable length array *) let store = Smart_stmt.store_stmt ~str_size:sz vi in - let env = Env.add_stmt ~post:true env kf store in + let env = Env.add_stmt ~post:true env store in init, env | ConsInit (caller, args, kind) -> @@ -102,7 +122,7 @@ let inject_in_local_init ~loc ~stmt env kf vi = function let _, env = if Libc.is_writing_memory caller then begin let result = Var vi, NoOffset in - Libc.update_memory_model ~loc ~stmt env kf ~result caller args + Libc.update_memory_model ~loc env kf ~result caller args end else None, env in @@ -125,19 +145,18 @@ let add_initializer loc ?vi lv ?(post=false) stmt env kf = in let must_model = Memory_tracking.must_monitor_lval ~stmt ~kf lv in if not (may_safely_ignore lv) && must_model then - let before = Cil.mkStmt ~valid_sid:true stmt.skind in let new_stmt = (* bitfields are not yet supported ==> no initializer. a [not_yet] will be raised in [Translate]. *) if Cil.isBitfield lv then Cil.mkEmptyStmt () else Smart_stmt.initialize ~loc lv in - let env = Env.add_stmt ~post ~before env kf new_stmt in + let env = Env.add_stmt ~post env new_stmt in let env = match vi with | None -> env | Some vi -> let new_stmt = Smart_stmt.store_stmt vi in - Env.add_stmt ~post ~before env kf new_stmt + Env.add_stmt ~post env new_stmt in env else @@ -165,7 +184,7 @@ let inject_in_instr env kf stmt = function let result, env = match caller.enode with | Lval (Var cvi, _) when Libc.is_writing_memory cvi -> - Libc.update_memory_model ~loc ~stmt env kf ?result cvi args + Libc.update_memory_model ~loc env kf ?result cvi args | _ -> result, env in (* add statement tracking initialization of return values *) @@ -182,7 +201,7 @@ let inject_in_instr env kf stmt = function match args with | [ { enode = CastE (_, { enode = Lval (Var vi, NoOffset) }) } ] -> let delete_block = Smart_stmt.delete_stmt ~is_addr:true vi in - Env.add_stmt env kf delete_block + Env.add_stmt env delete_block | _ -> Options.fatal "The normalization of __fc_vla_free() has changed" else env @@ -192,7 +211,7 @@ let inject_in_instr env kf stmt = function | Local_init(vi, linit, loc) -> let lv = Var vi, NoOffset in let env = add_initializer loc ~vi lv ~post:true stmt env kf in - let linit, env = inject_in_local_init ~loc ~stmt env kf vi linit in + let linit, env = inject_in_local_init ~loc env kf vi linit in Local_init(vi, linit, loc), env (* nothing to do: *) @@ -234,7 +253,7 @@ let add_new_block_in_stmt env kf stmt = let new_stmt, env = (* Remove local variables which scopes ended via goto/break/continue. *) let del_vars = Exit_points.delete_vars stmt in - let env = Memory_observer.delete_from_set ~before:stmt env kf del_vars in + let env = Memory_observer.delete_from_set env kf del_vars in if Kernel_function.is_return_stmt kf stmt then let env = if Functions.check kf then @@ -247,7 +266,7 @@ let add_new_block_in_stmt env kf stmt = let env = mk_post_env env stmt in (* also handle the postcondition of the function and clear the env *) - Translate_annots.post_funspec kf Kglobal env + Translate_annots.post_funspec kf env else env in @@ -259,11 +278,6 @@ let add_new_block_in_stmt env kf stmt = Env.pop_and_get env new_stmt ~global_clear:true Env.After in let new_stmt = Smart_stmt.block stmt b in - if not (Cil_datatype.Stmt.equal stmt new_stmt) then begin - (* move the labels of the return to the new block in order to - evaluate the postcondition when jumping to them. *) - E_acsl_label.move kf stmt new_stmt - end; new_stmt, env else (* i.e. not (is_return stmt) *) (* must generate [pre_block] which includes [stmt] before generating @@ -298,8 +312,6 @@ let add_new_block_in_stmt env kf stmt = else post_block in let res = Smart_stmt.block new_stmt post_block in - if not (Cil_datatype.Stmt.equal new_stmt res) then - E_acsl_label.move kf new_stmt res; res, env in Options.debug ~level:4 @@ -312,7 +324,7 @@ let add_new_block_in_stmt env kf stmt = The function [last_stmts] receives an optional argument [?return_stmt] with the innermost return statement if it exists. In that case the function needs to return this statement as the last statement. *) -let insert_as_last_stmts_in_innermost_block ~last_stmts kf outer_block = +let insert_as_last_stmts_in_innermost_block ~last_stmts outer_block = (* Retrieve the last innermost block *) let rec retrieve_innermost_last_return block = let l = List.rev block.bstmts in @@ -333,7 +345,6 @@ let insert_as_last_stmts_in_innermost_block ~last_stmts kf outer_block = | Some return_stmt -> let b = Cil.mkBlock new_stmts in let new_stmt = Smart_stmt.block return_stmt b in - E_acsl_label.move kf return_stmt new_stmt; [ new_stmt ] | None -> new_stmts in @@ -430,6 +441,7 @@ and inject_in_stmt env kf stmt = | Loop _ -> Env.push_loop env | _ -> env in + let env = Env.set_kinstr env (Kstmt stmt) in (* initial environment *) let env = if Kernel_function.is_first_stmt kf stmt then @@ -445,7 +457,7 @@ and inject_in_stmt env kf stmt = (* translate the precondition of the function *) if Functions.check kf then let funspec = Annotations.funspec kf in - Translate_annots.pre_funspec kf Kglobal env funspec + Translate_annots.pre_funspec kf env funspec else env else env @@ -465,7 +477,7 @@ and inject_in_stmt env kf stmt = (which adds initializers), otherwise init calls appear before store calls. *) let duplicates = Exit_points.store_vars stmt in - let env = Memory_observer.duplicate_store ~before:stmt env kf duplicates in + let env = Memory_observer.duplicate_store env kf duplicates in let skind, env = inject_in_substmt env kf stmt in stmt.skind <- skind; (* building the new block of code *) @@ -519,7 +531,7 @@ and inject_in_block (env: Env.t) kf blk = stmts in (* select the precise location to inject these pieces of code *) - insert_as_last_stmts_in_innermost_block ~last_stmts kf blk ; + insert_as_last_stmts_in_innermost_block ~last_stmts blk ; (* allocate the memory blocks observing locals *) if Functions.instrument kf then blk.bstmts <- @@ -650,7 +662,7 @@ let inject_in_global main global = (* Insert [stmt_begin] as the first statement of [fundec] and insert [stmt_end] as the last before [return] *) -let surround_function_with kf fundec stmt_begin stmt_end = +let surround_function_with fundec stmt_begin stmt_end = let body = fundec.sbody in (* Insert last statement *) Option.iter @@ -660,7 +672,7 @@ let surround_function_with kf fundec stmt_begin stmt_end = | Some return_stmt -> [ stmt_end; return_stmt ] | None -> [ stmt_end] in - insert_as_last_stmts_in_innermost_block ~last_stmts kf body) + insert_as_last_stmts_in_innermost_block ~last_stmts body) stmt_end; (* Insert first statement *) body.bstmts <- stmt_begin :: body.bstmts @@ -707,7 +719,7 @@ let inject_global_handler file main = in (* Surround the content of main with the calls to [__e_acsl_globals_init();] and [__e_acsl_globals_delete();] *) - surround_function_with main main_fundec stmt_init stmt_clean_opt; + surround_function_with main_fundec stmt_init stmt_clean_opt; (* Retrieve all globals except main *) let main_vi = Globals.Functions.get_vi main in let new_globals = @@ -798,7 +810,7 @@ let inject_mtracking_handler main = let args = args @ [ ptr_size ] in let init = Smart_stmt.rtl_call loc "memory_init" args in let clean = Smart_stmt.rtl_call loc "memory_clean" [] in - surround_function_with main fundec init (Some clean) + surround_function_with fundec init (Some clean) in Option.iter handle_main main end @@ -818,13 +830,9 @@ let reset_all ast = (* by default, do not run E-ACSL on the generated code *) Options.Run.off (); (* reset all the E-ACSL environments to their original states *) - Memory_tracking.reset (); Logic_functions.reset (); - Literal_strings.reset (); Global_observer.reset (); - Bound_variables.clear_guards (); - Logic_normalizer.clear (); - Typing.clear (); + Analyses.reset (); (* reset some kernel states: *) (* reset the CFG that has been heavily modified by the code generation step *) Cfg.clearFileCFG ~clear_id:false ast; @@ -834,23 +842,10 @@ let reset_all ast = Ast.mark_as_grown () let inject () = - Gmp_types.init (); let ast = Ast.get () in let current_project = Project.current() in Options.feedback ~level:2 - "preprocessing annotations in project %a" - Project.pretty current_project; - Logic_normalizer.preprocess ast; - Options.feedback ~level:2 - "normalizing quantifiers in project %a" - Project.pretty current_project; - Bound_variables.preprocess ast; - Options.feedback ~level:2 - "typing annotations in project %a" - Project.pretty current_project; - Typing.type_program ast; - Options.feedback ~level:2 - "injecting annotations as code in project %a" + "injecting annotations as code in %a" Project.pretty current_project; inject_in_file ast; reset_all ast; diff --git a/src/plugins/e-acsl/src/code_generator/libc.ml b/src/plugins/e-acsl/src/code_generator/libc.ml index 5c0ddb10d20bb8da524e10b46a61d333e88db513..9214791359cf7aea33e40780c45623d6a4f7c4a4 100644 --- a/src/plugins/e-acsl/src/code_generator/libc.ml +++ b/src/plugins/e-acsl/src/code_generator/libc.ml @@ -148,7 +148,7 @@ let zarith ~loc bop t1 t2 = (* Check that we are building an arithmetic operation *) (match bop with | PlusA | MinusA | Mult | Div | Mod | Shiftlt | Shiftrt -> () - | PlusPI | IndexPI | MinusPI | MinusPP | Lt | Gt | Le | Ge | Eq | Ne | BAnd + | PlusPI | MinusPI | MinusPP | Lt | Gt | Le | Ge | Eq | Ne | BAnd | BXor | BOr | LAnd | LOr -> Options.fatal "Using Libc.zarith to build '%a' instead of an arithmetic operation" @@ -224,7 +224,7 @@ let term_to_sizet_exp ~loc ~name ?(check_lower_bound=true) kf env t = Logic_const.prel ~loc (Rge, t, Cil.lzero ~loc ()) in let adata, env = Assert.empty ~loc kf env in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in let assertion, env = Assert.runtime_check ~adata @@ -248,9 +248,9 @@ let term_to_sizet_exp ~loc ~name ?(check_lower_bound=true) kf env t = let upper_guard_pp = Logic_const.prel ~loc (Rle, t, sizet_max_t) in let upper_guard = Cil.mkBinOp ~loc Le e sizet_max_e in let adata, env = Assert.empty ~loc kf env in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in let adata, env = - Assert.register ~loc kf env "SIZE_MAX" sizet_max_e adata + Assert.register ~loc env "SIZE_MAX" sizet_max_e adata in let assertion, env = Assert.runtime_check @@ -292,7 +292,7 @@ let term_to_sizet_exp ~loc ~name ?(check_lower_bound=true) kf env t = Printer.pp_term t (** Code generation of [update_memory_model] for [strcat] and [strncat]. *) -let process_strcat ~loc ~stmt ?result env kf ?size_e dest_e src_e = +let process_strcat ~loc ?result env kf ?size_e dest_e src_e = let src_size_vi, src_size_e, src_size_stmt, env = strlen ~loc ~name:"strcat_src_size" env kf src_e in @@ -341,22 +341,21 @@ let process_strcat ~loc ~stmt ?result env kf ?size_e dest_e src_e = let initialize_blk = Smart_stmt.block_stmt initialize_blk in let env = List.fold_right - (fun pre_stmt env -> Env.add_stmt ~before:stmt env kf pre_stmt) + (fun pre_stmt env -> Env.add_stmt env pre_stmt) pre_stmts env in - let env = Env.add_stmt ~post:true env kf initialize_blk in + let env = Env.add_stmt ~post:true env initialize_blk in result, env -let update_memory_model ~loc ~stmt ?result env kf caller args = +let update_memory_model ~loc ?result env kf caller args = let name = get_caller_name caller in let post = true in - let before = stmt in match name, args with | "memset", [ dest_e; _; size_e ] | "memcpy", [ dest_e; _; size_e ] | "memmove", [ dest_e; _; size_e ] -> let initialize = Smart_stmt.rtl_call ~loc "initialize" [dest_e; size_e] in - let env = Env.add_stmt ~post env kf initialize in + let env = Env.add_stmt ~post env initialize in result, env | "memset", _ | "memcpy", _ | "memmove", _ -> wrong_number_of_arguments name @@ -396,7 +395,7 @@ let update_memory_model ~loc ~stmt ?result env kf caller args = Env.pop_and_get env initialize ~global_clear:false Env.Middle in let env = - Env.add_stmt ~post env kf (Smart_stmt.block_stmt initialize_blk) + Env.add_stmt ~post env (Smart_stmt.block_stmt initialize_blk) in Some result, env | "fread", _ -> wrong_number_of_arguments name @@ -420,8 +419,8 @@ let update_memory_model ~loc ~stmt ?result env kf caller args = Env.pop_and_get env initialize ~global_clear:false Env.Middle in let initialize_blk = Smart_stmt.block_stmt initialize_blk in - let env = Env.add_stmt ~before env kf src_size_stmt in - let env = Env.add_stmt ~post env kf initialize_blk in + let env = Env.add_stmt env src_size_stmt in + let env = Env.add_stmt ~post env initialize_blk in result, env | "strcpy", _ -> wrong_number_of_arguments name @@ -429,16 +428,16 @@ let update_memory_model ~loc ~stmt ?result env kf caller args = let initialize = Smart_stmt.rtl_call ~loc "initialize" [ dest_e; size_e ] in - let env = Env.add_stmt ~post env kf initialize in + let env = Env.add_stmt ~post env initialize in result, env | "strncpy", _ -> wrong_number_of_arguments name | "strcat", [ dest_e; src_e ] -> - process_strcat ~loc ~stmt ?result env kf dest_e src_e + process_strcat ~loc ?result env kf dest_e src_e | "strcat", _ -> wrong_number_of_arguments name | "strncat", [ dest_e; src_e; size_e ] -> - process_strcat ~loc ~stmt ?result env kf ~size_e dest_e src_e + process_strcat ~loc ?result env kf ~size_e dest_e src_e | "strncat", _ -> wrong_number_of_arguments name | "sprintf", buffer_e :: _ :: _ -> @@ -462,7 +461,7 @@ let update_memory_model ~loc ~stmt ?result env kf caller args = ~cond:(Cil.mkBinOp ~loc Ge result_e (Cil.zero ~loc)) then_blk in - let env = Env.add_stmt ~post env kf if_res_pos_stmt in + let env = Env.add_stmt ~post env if_res_pos_stmt in Some result, env | "sprintf", _ -> wrong_number_of_arguments name @@ -530,7 +529,7 @@ let update_memory_model ~loc ~stmt ?result env kf caller args = ~cond:(Cil.mkBinOp ~loc LAnd res_pos size_strict_pos) blk in - let env = Env.add_stmt ~post env kf if_res_pos_stmt in + let env = Env.add_stmt ~post env if_res_pos_stmt in Some result, env | "snprintf", _ -> wrong_number_of_arguments name @@ -544,7 +543,7 @@ let update_memory_model ~loc ~stmt ?result env kf caller args = let unsound = Smart_stmt.assigns ~loc ~result:(Cil.var sound_verdict_vi) (Cil.zero ~loc) in - let env = Env.add_stmt ~post env kf unsound in + let env = Env.add_stmt ~post env unsound in result, env | _ -> (* If this error is raised, check that the call to diff --git a/src/plugins/e-acsl/src/code_generator/libc.mli b/src/plugins/e-acsl/src/code_generator/libc.mli index 95ef6e79624edf6940a3cac718d02f92650bfccc..a5323906c402c9a8c765db8034d38feae4be7853 100644 --- a/src/plugins/e-acsl/src/code_generator/libc.mli +++ b/src/plugins/e-acsl/src/code_generator/libc.mli @@ -29,16 +29,15 @@ val is_writing_memory: varinfo -> bool val update_memory_model: loc:location -> - stmt:stmt -> ?result:lval -> Env.t -> kernel_function -> varinfo -> exp list -> lval option * Env.t -(** [update_memory_model ~loc ~stmt env kf ?result caller args] generates code - in [env] to update the memory model after executing the libc function - [caller] with the given [args]. +(** [update_memory_model ~loc env kf ?result caller args] generates code in + [env] to update the memory model after executing the libc function [caller] + with the given [args]. @return a tuple [result_opt, env] where [result_opt] is an option with the lvalue for the result of the function and [env] is the updated environement. *) diff --git a/src/plugins/e-acsl/src/code_generator/logic_array.ml b/src/plugins/e-acsl/src/code_generator/logic_array.ml index 0a8733cbafaec3454019096110574b22c9853c74..d9a75dce63582b6e62faef1a030c5c4b0bfbf77d 100644 --- a/src/plugins/e-acsl/src/code_generator/logic_array.ml +++ b/src/plugins/e-acsl/src/code_generator/logic_array.ml @@ -46,7 +46,7 @@ let length_exp ~loc kf env ~name array = try let len = Cil.lenOfArray64 array_len in (Cil.kinteger64 ~loc len), env - with Cil.LenOfArray -> + with Cil.LenOfArray _ -> (* check RTE on the array before accessing its block length and offset *) let env = !translate_rte_ref kf env array in (* helper function *) @@ -243,10 +243,10 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 = Typing.preprocess_predicate (Env.Local_vars.get env) p; let adata, env = Assert.empty ~loc kf env in let adata, env = - Assert.register ~loc kf env "destination length" len adata + Assert.register ~loc env "destination length" len adata in let adata, env = - Assert.register ~loc kf env "current length" len_orig adata + Assert.register ~loc env "current length" len_orig adata in let stmt, env = Assert.runtime_check ~adata ~pred_kind:Assert Smart_stmt.RTE kf env e p @@ -278,7 +278,7 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 = (res_value ~flip:true ()) ]) in (* Build the statement in the current env *) - let env = Env.add_stmt env kf stmt in + let env = Env.add_stmt env stmt in (* Return the result expression with the result of the comparison *) comparison_exp, env diff --git a/src/plugins/e-acsl/src/code_generator/logic_functions.ml b/src/plugins/e-acsl/src/code_generator/logic_functions.ml index bf606c9c4e3f029ad93c118fd9d335ce00ae980e..396a60a119ea184373f456e2f09fb1a5773f3601 100644 --- a/src/plugins/e-acsl/src/code_generator/logic_functions.ml +++ b/src/plugins/e-acsl/src/code_generator/logic_functions.ml @@ -22,6 +22,7 @@ open Cil_types open Cil_datatype +module Error = Translation_error (**************************************************************************) (********************** Forward references ********************************) diff --git a/src/plugins/e-acsl/src/code_generator/loops.ml b/src/plugins/e-acsl/src/code_generator/loops.ml index 0b3150015a18099bc1f675d5b6ef1b7735b28505..0166604f9e73e238d5b69042cee73d2e2d39b218 100644 --- a/src/plugins/e-acsl/src/code_generator/loops.ml +++ b/src/plugins/e-acsl/src/code_generator/loops.ml @@ -22,6 +22,7 @@ open Cil open Cil_types +open Analyses_types (**************************************************************************) (********************** Forward references ********************************) @@ -133,7 +134,6 @@ let handle_annotations env kf stmt = let adata, env = Assert.register ~loc - kf env (Format.asprintf "old %a" Printer.pp_term t_old) e_old @@ -142,7 +142,6 @@ let handle_annotations env kf stmt = let adata, env = Assert.register ~loc - kf env (Format.asprintf "current %a" Printer.pp_term t) e @@ -184,7 +183,6 @@ let handle_annotations env kf stmt = let adata1, env = Assert.register ~loc - kf env (Format.asprintf "old %a" Printer.pp_term t) e_old @@ -225,7 +223,6 @@ let handle_annotations env kf stmt = in Assert.register ~loc - kf env (Format.asprintf "current %a" Printer.pp_term t) e @@ -291,7 +288,7 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars = match lscope_vars with | [] -> mk_innermost_block env - | Lscope.Lvs_quantif(t1, rel1, logic_x, rel2, t2) :: lscope_vars' -> + | Lvs_quantif(t1, rel1, logic_x, rel2, t2) :: lscope_vars' -> assert (rel1 == Rle && rel2 == Rlt); Typing.type_term ~use_gmp_opt:false ~lenv t1; Typing.type_term ~use_gmp_opt:false ~lenv t2; @@ -321,7 +318,7 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars = let lv_x = var var_x in let env = match ctx with | Typing.C_integer _ -> env - | Typing.Gmpz -> Env.add_stmt env kf (Gmp.init ~loc x) + | Typing.Gmpz -> Env.add_stmt env (Gmp.init ~loc x) | Typing.(C_float _ | Rational | Real | Nan) -> assert false in (* build the inner loops and loop body *) @@ -418,7 +415,7 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars = (* remove logic binding before returning *) Env.Logic_binding.remove env logic_x; [ start ; stmt ], env - | Lscope.Lvs_let(lv, t) :: lscope_vars' -> + | Lvs_let(lv, t) :: lscope_vars' -> let ty = Typing.get_typ ~lenv t in let vi_of_lv, exp_of_lv, env = Env.Logic_binding.add ~ty env kf lv in let e, _, env = term_to_exp kf env t in @@ -434,10 +431,10 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars = Env.Logic_binding.remove env lv; (* return *) let_stmt :: stmts, env - | Lscope.Lvs_formal _ :: _ -> + | Lvs_formal _ :: _ -> Error.not_yet "creating nested loops from formal variable of a logic function" - | Lscope.Lvs_global _ :: _ -> + | Lvs_global _ :: _ -> Error.not_yet "creating nested loops from global logic variable" diff --git a/src/plugins/e-acsl/src/code_generator/loops.mli b/src/plugins/e-acsl/src/code_generator/loops.mli index 6e07b47cc7d3a1490e90ee5195fe063d1844214c..9ac68edab8b98aa546a8375d629446e493b044d0 100644 --- a/src/plugins/e-acsl/src/code_generator/loops.mli +++ b/src/plugins/e-acsl/src/code_generator/loops.mli @@ -23,6 +23,7 @@ (** Loop specific actions. *) open Cil_types +open Analyses_types (**************************************************************************) (************************* Loop annotations *******************************) @@ -40,7 +41,7 @@ val handle_annotations: val mk_nested_loops: loc:location -> (Env.t -> stmt list * Env.t) -> kernel_function -> Env.t -> - Lscope.lscope_var list -> stmt list * Env.t + lscope_var list -> stmt list * Env.t (** [mk_nested_loops ~loc mk_innermost_block kf env lvars] creates nested loops (with the proper statements for initializing the loop counters) from the list of logic variables [lvars]. Quantified variables create diff --git a/src/plugins/e-acsl/src/code_generator/memory_observer.ml b/src/plugins/e-acsl/src/code_generator/memory_observer.ml index 03355a4f1cd282df3103395e12f128f002c26150..758ada02293078cc75d9cbef00fdf41d76db2890 100644 --- a/src/plugins/e-acsl/src/code_generator/memory_observer.ml +++ b/src/plugins/e-acsl/src/code_generator/memory_observer.ml @@ -22,12 +22,12 @@ open Cil_datatype -let tracking_stmt ?before fold mk_stmt env kf vars = +let tracking_stmt fold mk_stmt env kf vars = if Functions.instrument kf then fold (fun vi env -> if Memory_tracking.must_monitor_vi ~kf vi then - Env.add_stmt ?before env kf (mk_stmt vi) + Env.add_stmt env (mk_stmt vi) else env) vars @@ -35,36 +35,32 @@ let tracking_stmt ?before fold mk_stmt env kf vars = else env -let store ?before env kf vars = +let store env kf vars = tracking_stmt - ?before List.fold_right (* small list *) Smart_stmt.store_stmt env kf vars -let duplicate_store ?before env kf vars = +let duplicate_store env kf vars = tracking_stmt - ?before Varinfo.Set.fold Smart_stmt.duplicate_store_stmt env kf vars -let delete_from_list ?before env kf vars = +let delete_from_list env kf vars = tracking_stmt - ?before List.fold_right (* small list *) Smart_stmt.delete_stmt env kf vars -let delete_from_set ?before env kf vars = +let delete_from_set env kf vars = tracking_stmt - ?before Varinfo.Set.fold Smart_stmt.delete_stmt env diff --git a/src/plugins/e-acsl/src/code_generator/memory_observer.mli b/src/plugins/e-acsl/src/code_generator/memory_observer.mli index fad46432acb5627e915ce72a64a4c36516ba39d4..216988488b021a02bd34d9fcf66893d7c5998cb0 100644 --- a/src/plugins/e-acsl/src/code_generator/memory_observer.mli +++ b/src/plugins/e-acsl/src/code_generator/memory_observer.mli @@ -26,20 +26,17 @@ open Cil_types open Cil_datatype -val store: ?before:stmt -> Env.t -> kernel_function -> varinfo list -> Env.t +val store: Env.t -> kernel_function -> varinfo list -> Env.t (** For each variable of the given list, if necessary according to the mtracking analysis, add a call to [__e_acsl_store_block] in the given environment. *) -val duplicate_store: - ?before:stmt -> Env.t -> kernel_function -> Varinfo.Set.t -> Env.t +val duplicate_store: Env.t -> kernel_function -> Varinfo.Set.t -> Env.t (** Same as [store], with a call to [__e_acsl_duplicate_store_block]. *) -val delete_from_list: - ?before:stmt -> Env.t -> kernel_function -> varinfo list -> Env.t +val delete_from_list: Env.t -> kernel_function -> varinfo list -> Env.t (** Same as [store], with a call to [__e_acsl_delete_block]. *) -val delete_from_set: - ?before:stmt -> Env.t -> kernel_function -> Varinfo.Set.t -> Env.t +val delete_from_set: Env.t -> kernel_function -> Varinfo.Set.t -> Env.t (** Same as [delete_from_list] with a set of variables instead of a list. *) (* diff --git a/src/plugins/e-acsl/src/code_generator/memory_translate.ml b/src/plugins/e-acsl/src/code_generator/memory_translate.ml index 561199aa97ed7d3679507d33a4a3ec381c4712d5..28c79c7a0fd5a49a619817597983744a2cf08252 100644 --- a/src/plugins/e-acsl/src/code_generator/memory_translate.ml +++ b/src/plugins/e-acsl/src/code_generator/memory_translate.ml @@ -21,6 +21,7 @@ (**************************************************************************) open Cil_types +module Error = Translation_error (**************************************************************************) (********************** Forward references ********************************) @@ -143,10 +144,12 @@ let call ~adata ~loc kf name ctx env t = assert (name = "base_addr" || name = "block_length" || name = "offset" || name ="freeable"); let (e, adata), env = - Env.with_rte_and_result env true + Env.with_params_and_result + ~rte:true ~f:(fun env -> let e, adata, env = !term_to_exp_ref ~adata kf env t in (e, adata), env) + env in let e, env = Env.rtl_call_to_new_var @@ -218,10 +221,12 @@ let range_to_ptr_and_size ~adata ~loc kf env ptr r p = ~lenv:(Env.Local_vars.get env) ptr; let (ptr, adata), env = - Env.with_rte_and_result env true + Env.with_params_and_result + ~rte:true ~f:(fun env -> let e, adata, env = !term_to_exp_ref ~adata kf env ptr in (e, adata), env) + env in (* size *) let size_term = @@ -295,17 +300,18 @@ let range_to_ptr_and_size ~adata ~loc kf env ptr r p = [p] is the predicate under test. *) let term_to_ptr_and_size ~adata ~loc kf env t = let (e, adata), env = - Env.with_rte_and_result env true + Env.with_params_and_result + ~rte:true ~f:(fun env -> let e, adata, env = !term_to_exp_ref ~adata kf env t in (e, adata), env) + env in let ty = Misc.cty t.term_type in let sizeof = Smart_exp.ptr_sizeof ~loc ty in let adata, env = Assert.register ~loc:t.term_loc - kf env (Format.asprintf "%a" Printer.pp_exp sizeof) sizeof @@ -486,7 +492,7 @@ let call_with_tset if Misc.is_bitfield_pointers t.term_type then Error.not_yet "bitfield pointer"; match t.term_node with - | TBinOp((PlusPI | IndexPI), + | TBinOp(PlusPI, ptr, ({ term_node = Trange _ } as r)) -> if Misc.is_set_of_ptr_or_array ptr.term_type then diff --git a/src/plugins/e-acsl/src/code_generator/quantif.ml b/src/plugins/e-acsl/src/code_generator/quantif.ml index 2a5e0a68adecde5556a6eee78f339655f409245d..c1cb81ab441fa93f6c8003f647c03e9fae613e4f 100644 --- a/src/plugins/e-acsl/src/code_generator/quantif.ml +++ b/src/plugins/e-acsl/src/code_generator/quantif.ml @@ -22,6 +22,7 @@ open Cil_types open Cil +open Analyses_types (** Forward reference for [Translate_predicates.to_exp]. *) let predicate_to_exp_ref @@ -71,6 +72,7 @@ let convert kf env loc ~is_forall quantif = "preprocessing of quantified predicate" Bound_variables.get_preprocessed_quantifier quantif + Printer.pp_predicate in match has_empty_quantif_with_false_negative bound_vars, is_forall with | true, true -> @@ -91,7 +93,7 @@ let convert kf env loc ~is_forall quantif = and update logic scope in the process *) let lvs_guards, env = List.fold_right (fun (t1, lv, t2) (lvs_guards, env) -> - let lvs = Lscope.Lvs_quantif (t1, Rle, lv, Rlt, t2) in + let lvs = Lvs_quantif (t1, Rle, lv, Rlt, t2) in let env = Env.Logic_scope.extend env lvs in lvs :: lvs_guards, env) bound_vars @@ -140,7 +142,7 @@ let convert kf env loc ~is_forall quantif = Loops.mk_nested_loops ~loc mk_innermost_block kf env lvs_guards in let env = - Env.add_stmt env kf (Smart_stmt.block_stmt (mkBlock stmts)) + Env.add_stmt env (Smart_stmt.block_stmt (mkBlock stmts)) in (* where to jump to go out of the loop *) let end_loop = mkEmptyStmt ~loc () in @@ -148,7 +150,7 @@ let convert kf env loc ~is_forall quantif = let label = Label(label_name, loc, false) in end_loop.labels <- label :: end_loop.labels; end_loop_ref := end_loop; - let env = Env.add_stmt env kf end_loop in + let env = Env.add_stmt env end_loop in res, env end diff --git a/src/plugins/e-acsl/src/code_generator/rational.ml b/src/plugins/e-acsl/src/code_generator/rational.ml index 643823ebe1aa80e3c89d78e12fd682fbea180a71..17f633f25508e25c76b6e8026281030012882fea 100644 --- a/src/plugins/e-acsl/src/code_generator/rational.ml +++ b/src/plugins/e-acsl/src/code_generator/rational.ml @@ -223,7 +223,7 @@ let name_arith_bop = function | Mult -> "__gmpq_mul" | Div -> "__gmpq_div" | Mod | Lt | Gt | Le | Ge | Eq | Ne | BAnd | BXor | BOr | LAnd | LOr - | Shiftlt | Shiftrt | PlusPI | IndexPI | MinusPI | MinusPP -> assert false + | Shiftlt | Shiftrt | PlusPI | MinusPI | MinusPP -> assert false let binop ~loc bop e1 e2 env kf t_opt = let name = name_arith_bop bop in diff --git a/src/plugins/e-acsl/src/code_generator/temporal.ml b/src/plugins/e-acsl/src/code_generator/temporal.ml index 8e7c0b4123be95e27a9d22f56d14294703b73302..6635219091eebd327c4f965db37fcdea49f99ba5 100644 --- a/src/plugins/e-acsl/src/code_generator/temporal.ml +++ b/src/plugins/e-acsl/src/code_generator/temporal.ml @@ -27,6 +27,7 @@ module RTL = Functions.RTL module Libc = Functions.Libc +module Error = Translation_error open Cil_types open Cil_datatype @@ -181,7 +182,7 @@ let assign ?(ltype) lhs rhs loc = base pointer and index so there should be no pointer arithmetic operations there. The following bit is to make sure of it. *) (match op with - | MinusPI | PlusPI | IndexPI -> assert false + | MinusPI | PlusPI -> assert false | _ -> ()); base, Direct | _ -> assert false) @@ -193,7 +194,7 @@ let assign ?(ltype) lhs rhs loc = | AddrOf _ -> rhs | Lval lv -> Cil.mkAddrOf ~loc lv | Const _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ - | UnOp _ | BinOp _ | CastE _ | StartOf _ | Info _ -> + | UnOp _ | BinOp _ | CastE _ | StartOf _ -> Options.abort "unsupported RHS %a" Printer.pp_exp rhs in Some (lhs, rhs, Copy) (* va_list is a builtin type, we assume it has no pointers here and treat @@ -219,10 +220,10 @@ let mk_stmt_from_assign loc lhs rhs = (* ************************************************************************** *) (* Top-level handler for Set instructions *) -let set_instr ?(post=false) current_stmt loc lhs rhs env kf = +let set_instr ?(post=false) loc lhs rhs env kf = if Memory_tracking.must_monitor_lval ~kf lhs then Option.fold - ~some:(fun stmt -> Env.add_stmt ~before:current_stmt ~post env kf stmt) + ~some:(fun stmt -> Env.add_stmt ~post env stmt) ~none:env (mk_stmt_from_assign loc lhs rhs) else @@ -236,14 +237,13 @@ let set_instr ?(post=false) current_stmt loc lhs rhs env kf = module Function_call: sig (* Top-level handler for Call instructions *) val instr: - stmt -> lval option -> exp -> exp list -> location -> - Env.t -> kernel_function -> + lval option -> exp -> exp list -> location -> Env.t -> kernel_function -> Env.t end = struct (* Track function arguments: export referents of arguments to a global structure so they can be retrieved once that function is called *) - let save_params current_stmt loc args env kf = + let save_params loc args env kf = let (env, _) = List.fold_left (fun (env, index) param -> let lv = Mem(param), NoOffset in @@ -254,7 +254,7 @@ end = struct let env = if Memory_tracking.must_monitor_exp ~kf param then let stmt = Mk.save_param ~loc flow rhs index in - Env.add_stmt ~before:current_stmt ~post:false env kf stmt + Env.add_stmt ~post:false env stmt else env in (env, index+1)) @@ -266,7 +266,7 @@ end = struct (* Update local environment with a statement tracking temporal metadata associated with assignment [ret] = [func(args)]. *) - let call_with_ret ?(alloc=false) current_stmt loc ret env kf = + let call_with_ret ?(alloc=false) loc ret env = let rhs = Smart_exp.lval ~loc ret in let vals = assign ret rhs loc in (* Track referent numbers of assignments via function calls. @@ -297,13 +297,13 @@ end = struct else Mk.handle_return_referent ~save:false ~loc (Cil.mkAddrOf ~loc lhs) in - Env.add_stmt ~before:current_stmt ~post:true env kf stmt) + Env.add_stmt ~post:true env stmt) ~none:env vals (* Update local environment with a statement tracking temporal metadata associated with memcpy/memset call *) - let call_memxxx current_stmt loc args fexp env kf = + let call_memxxx loc args fexp env = if Libc.is_memcpy fexp || Libc.is_memset fexp then let prefix = RTL.temporal_prefix in let name = match fexp.enode with @@ -313,11 +313,11 @@ end = struct let stmt = Smart_stmt.rtl_call ~loc ~prefix name args in - Env.add_stmt ~before:current_stmt ~post:false env kf stmt + Env.add_stmt ~post:false env stmt else env - let instr current_stmt ret fexp args loc env kf = + let instr ret fexp args loc env kf = (* Add function calls to reset_parameters and reset_return before each function call regardless. They are not really required, as if the instrumentation is correct then the right parameters will be saved @@ -330,27 +330,27 @@ end = struct let name = "reset_parameters" in Smart_stmt.rtl_call ~loc ~prefix name [] in - let env = Env.add_stmt ~before:current_stmt ~post:false env kf stmt in + let env = Env.add_stmt ~post:false env stmt in let stmt = Mk.reset_return_referent ~loc in - let env = Env.add_stmt ~before:current_stmt ~post:false env kf stmt in + let env = Env.add_stmt ~post:false env stmt in (* Push parameters with either a call to a function pointer or a function definition otherwise there is no point. *) let has_def = Functions.has_fundef fexp in let env = if Cil.isFunctionType (Cil.typeOf fexp) || has_def then - save_params current_stmt loc args env kf + save_params loc args env kf else env in (* Handle special cases of memcpy/memset *) - let env = call_memxxx current_stmt loc args fexp env kf in + let env = call_memxxx loc args fexp env in (* Memory allocating functions have no definitions so below expression should capture them *) let alloc = not has_def in Option.fold ~some:(fun lhs -> if Memory_tracking.must_monitor_lval ~kf lhs then - call_with_ret ~alloc current_stmt loc lhs env kf + call_with_ret ~alloc loc lhs env else env) ~none:env ret @@ -363,30 +363,29 @@ end module Local_init: sig (* Top-level handler for Local_init instructions *) val instr: - stmt -> varinfo -> local_init -> location -> Env.t -> kernel_function -> - Env.t + varinfo -> local_init -> location -> Env.t -> kernel_function -> Env.t end = struct - let rec handle_init current_stmt offset loc vi init env kf = match init with + let rec handle_init offset loc vi init env kf = match init with | SingleInit exp -> - set_instr ~post:true current_stmt loc (Var vi, offset) exp env kf + set_instr ~post:true loc (Var vi, offset) exp env kf | CompoundInit(_, inits) -> List.fold_left (fun acc (off, init) -> let off = Cil.addOffset off offset in - handle_init current_stmt off loc vi init acc kf) + handle_init off loc vi init acc kf) env inits - let instr current_stmt vi li loc env kf = + let instr vi li loc env kf = if Memory_tracking.must_monitor_vi ~kf vi then match li with | AssignInit init -> - handle_init current_stmt NoOffset loc vi init env kf + handle_init NoOffset loc vi init env kf | ConsInit(fexp, args, _) -> let ret = Some (Cil.var vi) in let fexp = Cil.evar ~loc fexp in - Function_call.instr current_stmt ret fexp args loc env kf + Function_call.instr ret fexp args loc env kf else env end @@ -398,13 +397,13 @@ end (* Update local environment with a statement tracking temporal metadata associated with adding a function argument to a stack frame *) -let track_argument ?(typ) param index env kf = +let track_argument ?(typ) param index env = let typ = Option.value ~default:param.vtype typ in match Cil.unrollType typ with | TPtr _ | TComp _ -> let stmt = Mk.pull_param ~loc:Location.unknown param index in - Env.add_stmt ~post:false env kf stmt + Env.add_stmt ~post:false env stmt | TInt _ | TFloat _ | TEnum _ | TBuiltin_va_list _ -> env | TNamed _ -> assert false | TVoid _ |TArray _ | TFun _ -> @@ -417,20 +416,20 @@ let track_argument ?(typ) param index env kf = (* Update local environment [env] with statements tracking return value of a function. *) -let handle_return_stmt loc ret env kf = +let handle_return_stmt loc ret env = match ret.enode with | Lval lv -> if Cil.isPointerType (Cil.typeOfLval lv) then let exp = Cil.mkAddrOf ~loc lv in let stmt = Mk.handle_return_referent ~loc ~save:true exp in - Env.add_stmt ~post:false env kf stmt + Env.add_stmt ~post:false env stmt else env | _ -> Options.fatal "Something other than Lval in return" let handle_return_stmt loc ret env kf = if Memory_tracking.must_monitor_exp ~kf ret then - handle_return_stmt loc ret env kf + handle_return_stmt loc ret env else env (* }}} *) @@ -441,14 +440,14 @@ let handle_return_stmt loc ret env kf = (* Update local environment [env] with statements tracking instruction [instr] *) -let handle_instruction current_stmt instr env kf = +let handle_instruction instr env kf = match instr with | Set(lv, exp, loc) -> - set_instr current_stmt loc lv exp env kf + set_instr loc lv exp env kf | Call(ret, fexp, args, loc) -> - Function_call.instr current_stmt ret fexp args loc env kf + Function_call.instr ret fexp args loc env kf | Local_init(vi, li, loc) -> - Local_init.instr current_stmt vi li loc env kf + Local_init.instr vi li loc env kf | Asm _ -> Options.warning ~once:true ~current:true "@[Analysis is potentially incorrect in presence of assembly code.@]"; @@ -500,7 +499,7 @@ let handle_function_parameters kf env = (fun (env, index) param -> let env = if Memory_tracking.must_monitor_vi ~kf param - then track_argument param index env kf + then track_argument param index env else env in env, index + 1) @@ -513,7 +512,7 @@ let handle_function_parameters kf env = let handle_stmt stmt env kf = if is_enabled () then begin match stmt.skind with - | Instr instr -> handle_instruction stmt instr env kf + | Instr instr -> handle_instruction instr env kf | Return(ret, loc) -> Option.fold ~some:(fun ret -> handle_return_stmt loc ret env kf) ~none:env ret | Goto _ | Break _ | Continue _ | If _ | Switch _ | Loop _ | Block _ diff --git a/src/plugins/e-acsl/src/code_generator/translate_annots.ml b/src/plugins/e-acsl/src/code_generator/translate_annots.ml index 42e2045604e78b422e469d815abf5c73e524c8b6..a1d1cfb14b6e6fdd0a37f9550faf6ce526faa0b7 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_annots.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_annots.ml @@ -28,7 +28,8 @@ open Cil_datatype statements (if any) for runtime assertion checking. *) (* ************************************************************************** *) -let pre_funspec kf kinstr env funspec = +let pre_funspec kf env funspec = + let kinstr = Kglobal in let unsupported f x = ignore (Env.handle_error (fun env -> f x; env) env) in let convert_unsupported_clauses env = unsupported @@ -50,14 +51,21 @@ let pre_funspec kf kinstr env funspec = Cil.CurrentLoc.set loc; let env = convert_unsupported_clauses env in let contract = Contract.create ~loc funspec in - Env.with_rte env true - ~f:(fun env -> Contract.translate_preconditions kf kinstr env contract) + Env.with_params + ~rte:true + ~kinstr + ~f:(fun env -> Contract.translate_preconditions kf env contract) + env -let post_funspec kf kinstr env = - Env.with_rte env true - ~f:(fun env -> Contract.translate_postconditions kf kinstr env) +let post_funspec kf env = + Env.with_params + ~rte:true + ~kinstr:Kglobal + ~f:(fun env -> Contract.translate_postconditions kf env) + env let pre_code_annotation kf stmt env annot = + let kinstr = Kstmt stmt in let convert env = match annot.annot_content with | AAssert(l, p) -> if Translate_utils.must_translate @@ -65,8 +73,11 @@ let pre_code_annotation kf stmt env annot = let env = Env.set_annotation_kind env Smart_stmt.Assertion in if l <> [] then Env.not_yet env "@[assertion applied only on some behaviors@]"; - Env.with_rte env true + Env.with_params + ~rte:true + ~kinstr ~f:(fun env -> Translate_predicates.do_it kf env p) + env else env | AStmtSpec(l, spec) -> @@ -74,9 +85,11 @@ let pre_code_annotation kf stmt env annot = Env.not_yet env "@[statement contract applied only on some behaviors@]"; let loc = Stmt.loc stmt in let contract = Contract.create ~loc spec in - Env.with_rte env true - ~f:(fun env -> - Contract.translate_preconditions kf (Kstmt stmt) env contract) + Env.with_params + ~rte:true + ~kinstr + ~f:(fun env -> Contract.translate_preconditions kf env contract) + env | AInvariant(l, loop_invariant, p) -> if Translate_utils.must_translate (Property.ip_of_code_annot_single kf stmt annot) then @@ -84,8 +97,11 @@ let pre_code_annotation kf stmt env annot = if l <> [] then Env.not_yet env "@[invariant applied only on some behaviors@]"; let env = - Env.with_rte env true + Env.with_params + ~rte:true + ~kinstr ~f:(fun env -> Translate_predicates.do_it kf env p) + env in if loop_invariant then Env.add_loop_invariant env p @@ -121,10 +137,14 @@ let pre_code_annotation kf stmt env annot = Env.handle_error convert env let post_code_annotation kf stmt env annot = + let kinstr = Kstmt stmt in let convert env = match annot.annot_content with | AStmtSpec(_, _) -> - Env.with_rte env true - ~f:(fun env -> Contract.translate_postconditions kf (Kstmt stmt) env) + Env.with_params + ~rte:true + ~kinstr + ~f:(fun env -> Contract.translate_postconditions kf env) + env | AAssert _ | AInvariant _ | AVariant _ diff --git a/src/plugins/e-acsl/src/code_generator/translate_annots.mli b/src/plugins/e-acsl/src/code_generator/translate_annots.mli index 3c5669a3f974b29795a5de18093a8cbacf95a12b..a9931f901e90806678127d4001c3a9f5648273e3 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_annots.mli +++ b/src/plugins/e-acsl/src/code_generator/translate_annots.mli @@ -26,7 +26,7 @@ open Cil_types statements (if any) for runtime assertion checking. These C statements are part of the resulting environment. *) -val pre_funspec: kernel_function -> kinstr -> Env.t -> funspec -> Env.t +val pre_funspec: kernel_function -> Env.t -> funspec -> Env.t (** Translate the preconditions of the given function contract in the environment. The contract is attached to the kernel_function. @@ -34,7 +34,7 @@ val pre_funspec: kernel_function -> kinstr -> Env.t -> funspec -> Env.t taken to call {!post_funspec} at the right time to pop the right contract. *) -val post_funspec: kernel_function -> kinstr -> Env.t -> Env.t +val post_funspec: kernel_function -> Env.t -> Env.t (** Translate the postconditions of the current function contract in the environment. diff --git a/src/plugins/e-acsl/src/code_generator/translate_predicates.ml b/src/plugins/e-acsl/src/code_generator/translate_predicates.ml index dd9bd7e229511cc17a94b83b5c99601c1b3218f3..d369220466f63974ff0d2ec2f2cac11508847858 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_predicates.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_predicates.ml @@ -24,7 +24,8 @@ open Cil_types open Cil_datatype -let dkey = Options.dkey_translation +open Analyses_types +let dkey = Options.Dkey.translation (**************************************************************************) (********************** Forward references ********************************) @@ -77,7 +78,7 @@ let rec predicate_content_to_exp ~adata ?name kf env p = | Papp (li, [], args) -> let e, adata, env = Logic_functions.app_to_exp ~adata ~loc kf env li args in - let adata, env = Assert.register_pred ~loc kf env p e adata in + let adata, env = Assert.register_pred ~loc env p e adata in e, adata, env | Pdangling _ -> Env.not_yet env "\\dangling" | Pobject_pointer _ -> Env.not_yet env "\\object_pointer" @@ -99,7 +100,8 @@ let rec predicate_content_to_exp ~adata ?name kf env p = | Pand(p1, p2) -> (* p1 && p2 <==> if p1 then p2 else false *) Extlib.flatten - (Env.with_rte_and_result env true + (Env.with_params_and_result + ~rte:true ~f:(fun env -> let e1, adata, env1 = to_exp ~adata kf env p1 in let e2, adata, env2 = @@ -117,11 +119,13 @@ let rec predicate_content_to_exp ~adata ?name kf env p = e1 res2 (Cil.zero loc, env3)) - )) + ) + env) | Por(p1, p2) -> (* p1 || p2 <==> if p1 then true else p2 *) Extlib.flatten - (Env.with_rte_and_result env true + (Env.with_params_and_result + ~rte:true ~f:(fun env -> let e1, adata, env1 = to_exp ~adata kf env p1 in let env' = Env.push env1 in @@ -140,7 +144,8 @@ let rec predicate_content_to_exp ~adata ?name kf env p = e1 (Cil.one loc, env') res2) - )) + ) + env) | Pxor _ -> Env.not_yet env "xor" | Pimplies(p1, p2) -> (* (p1 ==> p2) <==> !p1 || p2 *) @@ -165,7 +170,8 @@ let rec predicate_content_to_exp ~adata ?name kf env p = Smart_exp.lnot ~loc e, adata, env | Pif(t, p2, p3) -> Extlib.flatten - (Env.with_rte_and_result env true + (Env.with_params_and_result + ~rte:true ~f:(fun env -> let e1, adata, env1 = Translate_terms.to_exp ~adata kf env t in let e2, adata, env2 = @@ -178,26 +184,32 @@ let rec predicate_content_to_exp ~adata ?name kf env p = Extlib.nest adata (Translate_utils.conditional_to_exp ~loc kf None e1 res2 res3) - )) + ) + env) | Plet(li, p) -> - let lvs = Lscope.Lvs_let(li.l_var_info, Misc.term_of_li li) in - let env = Env.Logic_scope.extend env lvs in + (* Translate the term registered to the \let logic variable *) let adata, env = Translate_utils.env_of_li ~adata ~loc kf env li in + (* Register the logic var to the logic scope *) + let lvs = Lvs_let(li.l_var_info, Misc.term_of_li li) in + let env = Env.Logic_scope.extend env lvs in + (* Translate the body of the \let *) let e, adata, env = to_exp ~adata kf env p in + (* Remove the logic var from the logic scope *) + let env = Env.Logic_scope.remove env lvs in Interval.Env.remove li.l_var_info; e, adata, env | Pforall _ | Pexists _ -> let e, env = Quantif.quantif_to_exp kf env p in - let adata, env = Assert.register_pred ~loc kf env p e adata in + let adata, env = Assert.register_pred ~loc env p e adata in e, adata, env | Pat(p, BuiltinLabel Here) -> to_exp ~adata kf env p | Pat(p', label) -> let lscope = Env.Logic_scope.get env in - let pot = Lscope.PoT_pred p' in + let pot = PoT_pred p' in if Lscope.is_used lscope pot then let e, env = At_with_lscope.to_exp ~loc kf env pot label in - let adata, env = Assert.register_pred ~loc kf env p e adata in + let adata, env = Assert.register_pred ~loc env p e adata in e, adata, env else begin (* convert [t'] to [e] in a separated local env *) @@ -206,7 +218,7 @@ let rec predicate_content_to_exp ~adata ?name kf env p = Translate_utils.at_to_exp_no_lscope kf env None label e in assert (sty = Typed_number.C_number); - let adata, env = Assert.register_pred ~loc kf env p e adata in + let adata, env = Assert.register_pred ~loc env p e adata in e, adata, env end | Pvalid_read(BuiltinLabel Here, t) as pc @@ -220,7 +232,7 @@ let rec predicate_content_to_exp ~adata ?name kf env p = let e, adata, env = Memory_translate.call_valid ~adata ~loc kf name Cil.intType env t p in - let adata, env = Assert.register_pred ~loc kf env p e adata in + let adata, env = Assert.register_pred ~loc env p e adata in e, adata, env in (* we already transformed \valid(t) into \initialized(&t) && \valid(t): @@ -259,7 +271,7 @@ let rec predicate_content_to_exp ~adata ?name kf env p = tlist p in - let adata, env = Assert.register_pred ~loc kf env p e adata in + let adata, env = Assert.register_pred ~loc env p e adata in e, adata, env | Pinitialized(BuiltinLabel Here, t) -> let e, adata, env = @@ -282,7 +294,7 @@ let rec predicate_content_to_exp ~adata ?name kf env p = [ t ] p in - let adata, env = Assert.register_pred ~loc kf env p e adata in + let adata, env = Assert.register_pred ~loc env p e adata in e, adata, env) in e, adata, env @@ -292,7 +304,7 @@ let rec predicate_content_to_exp ~adata ?name kf env p = let e, adata, env = Memory_translate.call ~adata ~loc kf "freeable" Cil.intType env t in - let adata, env = Assert.register_pred ~loc kf env p e adata in + let adata, env = Assert.register_pred ~loc env p e adata in e, adata, env | Pfreeable _ -> Env.not_yet env "labeled \\freeable" | Pfresh _ -> Env.not_yet env "\\fresh" @@ -303,7 +315,8 @@ and to_exp ~adata ?name kf ?rte env p = | PoT_pred p -> let rte = match rte with None -> Env.generate_rte env | Some b -> b in Extlib.flatten - (Env.with_rte_and_result env false + (Env.with_params_and_result + ~rte:false ~f:(fun env -> let e, adata, env = predicate_content_to_exp ~adata ?name kf env p @@ -325,7 +338,8 @@ and to_exp ~adata ?name kf ?rte env p = Typed_number.C_number None e) - )) + ) + env) let generalized_untyped_to_exp ~adata ?name kf ?rte env p = (* If [rte] is true, it means we're translating the root predicate of an @@ -366,10 +380,7 @@ let do_it ?pred_to_print kf env p = e pred_to_print in - Env.add_stmt - env - kf - stmt + Env.add_stmt env stmt | Admit -> env let predicate_to_exp_without_rte ~adata kf env p = @@ -391,7 +402,7 @@ exception No_simple_translation of predicate However, it is correct to use it only in specific contexts. *) let untyped_to_exp p = let env = Env.push Env.empty in - let env = Env.rte env false in + let env = Env.set_rte env false in let e, _, env = try generalized_untyped_to_exp ~adata:Assert.no_data diff --git a/src/plugins/e-acsl/src/code_generator/translate_rtes.ml b/src/plugins/e-acsl/src/code_generator/translate_rtes.ml index 5aca164b247a1383f89861087862011eb670aab2..cb05e6165e836d1d4af09838076e50a3e24df24c 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_rtes.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_rtes.ml @@ -23,7 +23,7 @@ (** Generate and translate RTE annotations. *) open Cil_types -let dkey = Options.dkey_translation +let dkey = Options.Dkey.translation let rte_annots pp elt kf env l = let old_kind = Env.annotation_kind env in @@ -41,8 +41,10 @@ let rte_annots pp elt kf env l = let lscope_reset_old = Env.Logic_scope.get_reset env in let env = Env.Logic_scope.set_reset env false in let env = - Env.with_rte env false + Env.with_params + ~rte:false ~f:(fun env -> Translate_predicates.do_it kf env p) + env in let env = Env.Logic_scope.set_reset env lscope_reset_old in env) diff --git a/src/plugins/e-acsl/src/code_generator/translate_terms.ml b/src/plugins/e-acsl/src/code_generator/translate_terms.ml index 7506c183009b3c3dd5ee33141d4d3887fc686741..a1e55e5d0eb17749669e4a9642917b3f3e50c198 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_terms.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_terms.ml @@ -23,7 +23,8 @@ (** Generate C implementations of E-ACSL terms. *) open Cil_types -let dkey = Options.dkey_translation +open Analyses_types +let dkey = Options.Dkey.translation (**************************************************************************) (********************** Forward references ********************************) @@ -254,8 +255,8 @@ and extended_quantifier_to_exp ~adata ~loc kf env t t_min t_max lambda name = in let final_stmt = (Cil.mkBlock [ init_k_stmt; for_stmt ]) in Env.Logic_binding.remove env k; - let env = Env.add_stmt env kf (Smart_stmt.block_stmt final_stmt) in - let adata, env = Assert.register_term ~loc kf env t acc_as_exp adata in + let env = Env.add_stmt env (Smart_stmt.block_stmt final_stmt) in + let adata, env = Assert.register_term ~loc env t acc_as_exp adata in acc_as_exp, adata, env, Typed_number.C_number, "" | _ -> assert false @@ -270,29 +271,29 @@ and context_insensitive_term_to_exp ~adata kf env t = | TLval lv -> let lv, env, name = tlval_to_lval kf env lv in let e = Smart_exp.lval ~loc lv in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in e, adata, env, Typed_number.C_number, name | TSizeOf ty -> let e = Cil.sizeOf ~loc ty in - let adata, env = Assert.register_term ~loc kf env ~force:true t e adata in + let adata, env = Assert.register_term ~loc env ~force:true t e adata in e, adata, env, Typed_number.C_number, "sizeof" | TSizeOfE t' -> let e', _, env = to_exp ~adata:Assert.no_data kf env t' in let e = Cil.sizeOf ~loc (Cil.typeOf e') in - let adata, env = Assert.register_term ~loc kf env ~force:true t e adata in + let adata, env = Assert.register_term ~loc env ~force:true t e adata in e, adata, env, Typed_number.C_number, "sizeof" | TSizeOfStr s -> let e = Cil.new_exp ~loc (SizeOfStr s) in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in e, adata, env, Typed_number.C_number, "sizeofstr" | TAlignOf ty -> let e = Cil.new_exp ~loc (AlignOf ty) in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in e, adata, env, Typed_number.C_number, "alignof" | TAlignOfE t' -> let e', _, env = to_exp ~adata:Assert.no_data kf env t' in let e = Cil.new_exp ~loc (AlignOfE e') in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in e, adata, env, Typed_number.C_number, "alignof" | TUnOp(Neg | BNot as op, t') -> let ty = Typing.get_typ ~lenv t in @@ -378,7 +379,7 @@ and context_insensitive_term_to_exp ~adata kf env t = all data. *) let adata2, env = Assert.empty ~loc kf env in let e2, adata2, env = t2_to_exp adata2 env in - let adata, env = Assert.merge_right ~loc kf env adata2 adata in + let adata, env = Assert.merge_right ~loc env adata2 adata in (* TODO: preventing division by zero should not be required anymore. RTE should do this automatically. *) let ctx = Typing.get_number_ty ~lenv t in @@ -466,8 +467,8 @@ and context_insensitive_term_to_exp ~adata kf env t = let adata2, env = Assert.empty ~loc kf env in let e1, adata1, env = t1_to_exp adata1 env in let e2, adata2, env = t2_to_exp adata2 env in - let adata, env = Assert.merge_right ~loc kf env adata1 adata in - let adata, env = Assert.merge_right ~loc kf env adata2 adata in + let adata, env = Assert.merge_right ~loc env adata1 adata in + let adata, env = Assert.merge_right ~loc env adata2 adata in (* If the given term is an lvalue variable or a cast from an lvalue variable, retrieve the name of this variable. Otherwise return default *) @@ -617,7 +618,7 @@ and context_insensitive_term_to_exp ~adata kf env t = else (* Manual clean because [runtime_check] has not been called on [adata1]. *) - let env = Assert.clean ~loc kf env adata1 in + let env = Assert.clean ~loc env adata1 in None, env in let mk_stmts _ e = @@ -640,7 +641,8 @@ and context_insensitive_term_to_exp ~adata kf env t = (* t1 || t2 <==> if t1 then true else t2 *) let e, adata, env = Extlib.flatten - (Env.with_rte_and_result env true + (Env.with_params_and_result + ~rte:true ~f:(fun env -> let e1, adata, env1 = to_exp ~adata kf env t1 in let env' = Env.push env1 in @@ -652,14 +654,16 @@ and context_insensitive_term_to_exp ~adata kf env t = adata (Translate_utils.conditional_to_exp ~name:"or" ~loc kf (Some t) e1 (Cil.one loc, env') res2) - )) + ) + env) in e, adata, env, Typed_number.C_number, "" | TBinOp(LAnd, t1, t2) -> (* t1 && t2 <==> if t1 then t2 else false *) let e, adata, env = Extlib.flatten - (Env.with_rte_and_result env true + (Env.with_params_and_result + ~rte:true ~f:(fun env -> let e1, adata, env1 = to_exp ~adata kf env t1 in let e2, adata, env2 = @@ -671,7 +675,8 @@ and context_insensitive_term_to_exp ~adata kf env t = adata (Translate_utils.conditional_to_exp ~name:"and" ~loc kf (Some t) e1 res2 (Cil.zero loc, env3)) - )) + ) + env) in e, adata, env, Typed_number.C_number, "" | TBinOp((BOr | BXor | BAnd) as bop, t1, t2) -> @@ -694,7 +699,7 @@ and context_insensitive_term_to_exp ~adata kf env t = let e = Cil.new_exp ~loc (BinOp(bop, e1, e2, ty)) in e, adata, env, Typed_number.C_number, "" end - | TBinOp(PlusPI | IndexPI | MinusPI as bop, t1, t2) -> + | TBinOp(PlusPI | MinusPI as bop, t1, t2) -> if Misc.is_set_of_ptr_or_array t1.term_type || Misc.is_set_of_ptr_or_array t2.term_type then (* case of arithmetic over set of pointers (due to use of ranges) @@ -741,12 +746,12 @@ and context_insensitive_term_to_exp ~adata kf env t = | TAddrOf lv -> let lv, env, _ = tlval_to_lval kf env lv in let e = Cil.mkAddrOf ~loc lv in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in e, adata, env, Typed_number.C_number, "addrof" | TStartOf lv -> let lv, env, _ = tlval_to_lval kf env lv in let e = Cil.mkAddrOrStartOf ~loc lv in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in e, adata, env, Typed_number.C_number, "startof" | Tapp(li, _, [ t1; t2; {term_node = Tlambda([ _ ], _)} as lambda ]) when li.l_body = LBnone && (li.l_var_info.lv_name = "\\sum" || @@ -758,7 +763,7 @@ and context_insensitive_term_to_exp ~adata kf env t = | Tapp(li, [], args) -> let e, adata, env = Logic_functions.app_to_exp ~adata ~loc ~tapp:t kf env li args in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in e, adata, env, Typed_number.C_number, "app" | Tapp(_, _ :: _, _) -> Env.not_yet env "logic functions with labels" @@ -769,7 +774,8 @@ and context_insensitive_term_to_exp ~adata kf env t = | Tif(t1, t2, t3) -> let e, adata, env = Extlib.flatten - (Env.with_rte_and_result env true + (Env.with_params_and_result + ~rte:true ~f:(fun env -> let e1, adata, env1 = to_exp ~adata kf env t1 in let e2, adata, env2 = @@ -789,7 +795,8 @@ and context_insensitive_term_to_exp ~adata kf env t = e1 res2 res3) - )) + ) + env) in e, adata, env, Typed_number.C_number, "" | Tat(t, BuiltinLabel Here) -> @@ -797,17 +804,17 @@ and context_insensitive_term_to_exp ~adata kf env t = e, adata, env, Typed_number.C_number, "" | Tat(t', label) -> let lscope = Env.Logic_scope.get env in - let pot = Lscope.PoT_term t' in + let pot = PoT_term t' in if Lscope.is_used lscope pot then let e, env = At_with_lscope.to_exp ~loc kf env pot label in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in e, adata, env, Typed_number.C_number, "" else let e, _, env = to_exp ~adata:Assert.no_data kf (Env.push env) t' in let e, env, sty = Translate_utils.at_to_exp_no_lscope kf env (Some t) label e in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in e, adata, env, sty, "" | Tbase_addr(BuiltinLabel Here, t') -> let name = "base_addr" in @@ -821,7 +828,7 @@ and context_insensitive_term_to_exp ~adata kf env t = env t' in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in e, adata, env, Typed_number.C_number, name | Tbase_addr _ -> Env.not_yet env "labeled \\base_addr" | Toffset(BuiltinLabel Here, t') -> @@ -830,7 +837,7 @@ and context_insensitive_term_to_exp ~adata kf env t = let e, adata, env = Memory_translate.call ~adata ~loc kf name size_t env t' in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in e, adata, env, Typed_number.C_number, name | Toffset _ -> Env.not_yet env "labeled \\offset" | Tblock_length(BuiltinLabel Here, t') -> @@ -839,7 +846,7 @@ and context_insensitive_term_to_exp ~adata kf env t = let e, adata, env = Memory_translate.call ~adata ~loc kf name size_t env t' in - let adata, env = Assert.register_term ~loc kf env t e adata in + let adata, env = Assert.register_term ~loc env t e adata in e, adata, env, Typed_number.C_number, name | Tblock_length _ -> Env.not_yet env "labeled \\block_length" | Tnull -> @@ -854,10 +861,15 @@ and context_insensitive_term_to_exp ~adata kf env t = | Tcomprehension _ -> Env.not_yet env "tset comprehension" | Trange _ -> Env.not_yet env "range" | Tlet(li, t) -> - let lvs = Lscope.Lvs_let(li.l_var_info, Misc.term_of_li li) in - let env = Env.Logic_scope.extend env lvs in + (* Translate the term registered to the \let logic variable *) let adata, env = Translate_utils.env_of_li ~adata ~loc kf env li in + (* Register the logic var to the logic scope *) + let lvs = Lvs_let(li.l_var_info, Misc.term_of_li li) in + let env = Env.Logic_scope.extend env lvs in + (* Translate the body of the \let *) let e, adata, env = to_exp ~adata kf env t in + (* Remove the logic var from the logic scope *) + let env = Env.Logic_scope.remove env lvs in Interval.Env.remove li.l_var_info; e, adata, env, Typed_number.C_number, "" @@ -872,7 +884,8 @@ and to_exp ~adata kf env t = (Env.Local_vars.get env); let t = Logic_normalizer.get_term t in Extlib.flatten - (Env.with_rte_and_result env false + (Env.with_params_and_result + ~rte:false ~f:(fun env -> let e, adata, env, sty, name = context_insensitive_term_to_exp ~adata kf env t @@ -893,7 +906,8 @@ and to_exp ~adata kf env t = sty (Some t) e) - )) + ) + env) let () = Translate_utils.term_to_exp_ref := to_exp; @@ -919,7 +933,7 @@ let untyped_to_exp typ t = let ctx = Option.map ctx_of_typ typ in Typing.type_term ~use_gmp_opt:true ~lenv:[] ?ctx t; let env = Env.push Env.empty in - let env = Env.rte env false in + let env = Env.set_rte env false in let e, _, env = try to_exp ~adata:Assert.no_data (Kernel_function.dummy ()) env t with Rtl.Symbols.Unregistered _ -> raise (No_simple_translation t) diff --git a/src/plugins/e-acsl/src/code_generator/translate_utils.ml b/src/plugins/e-acsl/src/code_generator/translate_utils.ml index 5b7e7871488d30b22bdc6f9dd21a885c5e638402..89fe539c7f5edc1fc697376d49c057f9becc6d76 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_utils.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_utils.ml @@ -25,6 +25,7 @@ module E_acsl_label = Label open Cil_types open Cil_datatype +module Error = Translation_error (**************************************************************************) (********************** Forward references ********************************) @@ -289,7 +290,7 @@ let env_of_li ~adata ~loc kf env li = | Typing.Real -> Error.not_yet "real number" in - adata, Env.add_stmt env kf stmt + adata, Env.add_stmt env stmt | Ltype _ -> Env.not_yet env "user-defined logic type" | Lvar _ -> diff --git a/src/plugins/e-acsl/src/code_generator/translation_error.ml b/src/plugins/e-acsl/src/code_generator/translation_error.ml new file mode 100644 index 0000000000000000000000000000000000000000..5636d7d244c6781e810aedc9dfeeafefaa53e3d1 --- /dev/null +++ b/src/plugins/e-acsl/src/code_generator/translation_error.ml @@ -0,0 +1,23 @@ +(**************************************************************************) +(* *) +(* This file is part of the Frama-C's E-ACSL plug-in. *) +(* *) +(* Copyright (C) 2012-2021 *) +(* CEA (Commissariat à l'énergie atomique et aux énergies *) +(* alternatives) *) +(* *) +(* you can redistribute it and/or modify it under the terms of the GNU *) +(* Lesser General Public License as published by the Free Software *) +(* Foundation, version 2.1. *) +(* *) +(* It is distributed in the hope that it will be useful, *) +(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) +(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) +(* GNU Lesser General Public License for more details. *) +(* *) +(* See the GNU Lesser General Public License version 2.1 *) +(* for more details (enclosed in the file licenses/LGPLv2.1). *) +(* *) +(**************************************************************************) + +include Error.Make(struct let phase = Options.Dkey.translation end) diff --git a/src/plugins/e-acsl/src/code_generator/translation_error.mli b/src/plugins/e-acsl/src/code_generator/translation_error.mli new file mode 100644 index 0000000000000000000000000000000000000000..24208ba225d372a1a1232b30827c5ef5ee7fe70b --- /dev/null +++ b/src/plugins/e-acsl/src/code_generator/translation_error.mli @@ -0,0 +1,23 @@ +(**************************************************************************) +(* *) +(* This file is part of the Frama-C's E-ACSL plug-in. *) +(* *) +(* Copyright (C) 2012-2021 *) +(* CEA (Commissariat à l'énergie atomique et aux énergies *) +(* alternatives) *) +(* *) +(* you can redistribute it and/or modify it under the terms of the GNU *) +(* Lesser General Public License as published by the Free Software *) +(* Foundation, version 2.1. *) +(* *) +(* It is distributed in the hope that it will be useful, *) +(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) +(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) +(* GNU Lesser General Public License for more details. *) +(* *) +(* See the GNU Lesser General Public License version 2.1 *) +(* for more details (enclosed in the file licenses/LGPLv2.1). *) +(* *) +(**************************************************************************) + +include Error.S diff --git a/src/plugins/e-acsl/src/libraries/error.ml b/src/plugins/e-acsl/src/libraries/error.ml index 6062ebdf0d6976ed1537f90c9d10dbda579798cd..4fdf23fe5993d7e7189e82bad9feba010b7361f8 100644 --- a/src/plugins/e-acsl/src/libraries/error.ml +++ b/src/plugins/e-acsl/src/libraries/error.ml @@ -20,72 +20,117 @@ (* *) (**************************************************************************) -exception Ignored -let ignored () = raise Ignored - -exception Typing_error of string -let untypable s = raise (Typing_error s) - -exception Not_yet of string -let not_yet s = raise (Not_yet s) - -exception Not_memoized -let not_memoized () = raise Not_memoized - -module Nb_typing = - State_builder.Ref - (Datatype.Int) - (struct - let name = "E_ACSL.Error.Nb_typing" - let default () = 0 - let dependencies = [ Ast.self ] - end) - -let nb_untypable = Nb_typing.get - -module Nb_not_yet = - State_builder.Ref - (Datatype.Int) - (struct - let name = "E_ACSL.Error.Nb_not_yet" - let default () = 0 - let dependencies = [ Ast.self ] - end) - -let nb_not_yet = Nb_not_yet.get - -let print_not_yet msg = - let msg = - Format.sprintf "@[E-ACSL construct@ `%s'@ is not yet supported.@]" msg - in - Options.warning ~once:true ~current:true "@[%s@ Ignoring annotation.@]" msg; - Nb_not_yet.set (Nb_not_yet.get () + 1) - -let generic_handle f res x = - try - f x - with - | Typing_error s -> - let msg = Format.sprintf "@[invalid E-ACSL construct@ `%s'.@]" s in - Options.warning ~once:true ~current:true "@[%s@ Ignoring annotation.@]" msg; - Nb_typing.set (Nb_typing.get () + 1); - res - | Not_yet s -> - print_not_yet s; - res - | Ignored -> res - -let handle f x = generic_handle f x x - -type 'a or_error = Res of 'a | Err of exn - -let retrieve_preprocessing analyse_name getter parameter = - try - match getter parameter with - | Res res -> res - | Err exn -> raise exn - with Not_memoized -> - Options.fatal "%s was not performed on construct" analyse_name +(** Internal module holding the exception of [Error]. + + The module is included into [Make_with_opt] later and should not be used + directly. However we need to have a separate module for the exception so + that every exception built by [Make] is the exact same type. *) +module Exn = struct + exception Typing_error of Options.category option * string + exception Not_yet of Options.category option * string + exception Not_memoized of Options.category option +end + +module type S = sig + type 'a result = ('a, exn) Result.t + include module type of Exn + val make_untypable: string -> exn + val make_not_yet: string -> exn + val make_not_memoized: unit -> exn + val untypable: string -> 'a + val not_yet: string -> 'a + val not_memoized: unit -> 'a + val print_not_yet: string -> unit + val handle: ('a -> 'a) -> 'a -> 'a + val generic_handle: ('a -> 'b) -> 'b -> 'a -> 'b + val retrieve_preprocessing: + string -> + ('a -> 'b result) -> + 'a -> + (Format.formatter -> 'a -> unit) -> + 'b + val pp_result: + (Format.formatter -> 'a -> unit) -> + Format.formatter -> + 'a result -> + unit +end + +module Make_with_opt(P: sig val phase:Options.category option end): S = struct + type 'a result = ('a, exn) Result.t + include Exn + + let make_untypable msg = Typing_error (P.phase, msg) + let make_not_yet msg = Not_yet (P.phase, msg) + let make_not_memoized () = Not_memoized P.phase + + let untypable msg = raise (make_untypable msg) + let not_yet msg = raise (make_not_yet msg) + let not_memoized () = raise (make_not_memoized ()) + + let pp_phase fmt phase = + match phase with + | Some phase -> + if Options.verbose_atleast 2 then + Format.fprintf fmt "@[@ in phase `%a'@]" Options.pp_category phase + | None -> () + + let do_print_not_yet phase msg = + let msg = + Format.asprintf + "@[E-ACSL construct@ `%s'@ is not yet supported%a.@]" + msg + pp_phase phase + in + Options.warning + ~once:true ~current:true + "@[%s@ Ignoring annotation.@]" msg + + let print_not_yet msg = + do_print_not_yet P.phase msg + + let generic_handle f res x = + try + f x + with + | Typing_error (phase, s) -> + let msg = + Format.asprintf "@[invalid E-ACSL construct@ `%s'%a.@]" + s + pp_phase phase + in + Options.warning + ~once:true ~current:true + "@[%s@ Ignoring annotation.@]" msg; + res + | Not_yet (phase, s) -> + do_print_not_yet phase s; + res + + let handle f x = generic_handle f x x + + let retrieve_preprocessing analyse_name getter parameter pp = + try + match getter parameter with + | Result.Ok res -> res + | Result.Error exn -> raise exn + with Not_memoized phase -> + Options.fatal + "@[%s was not performed on construct %a%a@]" + analyse_name + pp parameter + pp_phase phase + + let pp_result pp fmt res = + match res with + | Result.Ok a -> Format.fprintf fmt "@[%a@]" pp a + | Result.Error err -> Format.fprintf fmt "@[%s@]" (Printexc.to_string err) +end + +module Make(P: sig val phase:Options.category end): S = + Make_with_opt(struct let phase = Some P.phase end) + +include Make_with_opt(struct let phase = None end) (* Local Variables: diff --git a/src/plugins/e-acsl/src/libraries/error.mli b/src/plugins/e-acsl/src/libraries/error.mli index 9dcc0355b6138e532e11a285244655646958be28..c83496560bf0279258eeb0f07534d4aef78f2757 100644 --- a/src/plugins/e-acsl/src/libraries/error.mli +++ b/src/plugins/e-acsl/src/libraries/error.mli @@ -22,50 +22,77 @@ (** Handling errors. *) -exception Ignored -exception Typing_error of string -exception Not_yet of string -exception Not_memoized +module type S = sig + type 'a result = ('a, exn) Result.t + (** Represent either a result of type ['a] or an error with an exception. *) -type 'a or_error = Res of 'a | Err of exn + exception Typing_error of Options.category option * string + (** Typing error where the first element is the phase where the error occured + and the second element is the error message. *) -val untypable: string -> 'a -(** Type error built from the given argument. *) + exception Not_yet of Options.category option * string + (** "Not yet supported" error where the first element is the phase where the + error occured and the second element is the error message. *) -val not_yet: string -> 'a -(** Not_yet_implemented error built from the given argument. *) + exception Not_memoized of Options.category option + (** "Not memoized" error with the phase where the error occured. *) -val ignored: unit -> 'a -(** Statement already signaled and marked as ignored *) + val make_untypable: string -> exn + (** Make a [Typing_error] exception with the given message. *) -val not_memoized : unit -> 'a -(** @raise Not_memoized when asking the preprocessed form of something that - was not preprocessed *) + val make_not_yet: string -> exn + (** Make a [Not_yet] exception with the given message. *) -val handle: ('a -> 'a) -> 'a -> 'a -(** Run the closure with the given argument and handle potential errors. - Return the provide argument in case of errors. *) + val make_not_memoized: unit -> exn + (** Make a [Not_memoized] exception with the given message. *) -val generic_handle: ('a -> 'b) -> 'b -> 'a -> 'b -(** Run the closure with the given argument and handle potential errors. - Return the additional argument in case of errors. *) + val untypable: string -> 'a + (** @raise Typing_error with the given message for the current phase. *) -val nb_untypable: unit -> int -(** Number of untypable annotations. *) + val not_yet: string -> 'a + (** @raise Not_yet with the given message for the current phase. *) -val nb_not_yet: unit -> int -(** Number of not-yet-supported annotations. *) + val not_memoized: unit -> 'a + (** @raise Not_memoized for the current phase. *) -val print_not_yet: string -> unit -(** Print the "not yet" message without raising an exception. *) + val print_not_yet: string -> unit + (** Print the "not yet supported" message without raising an exception. *) -val retrieve_preprocessing: string -> ('a -> 'b or_error) -> 'a -> 'b -(** Retrieve the result of a preprocessing phase, which possibly failed. - The [string] argument is used to display a message in case the preprocessing - phase did not compute the required result. *) + val handle: ('a -> 'a) -> 'a -> 'a + (** Run the closure with the given argument and handle potential errors. + Return the provide argument in case of errors. *) + + val generic_handle: ('a -> 'b) -> 'b -> 'a -> 'b + (** Run the closure with the given argument and handle potential errors. + Return the additional argument in case of errors. *) + + val retrieve_preprocessing: + string -> + ('a -> 'b result) -> + 'a -> + (Format.formatter -> 'a -> unit) -> + 'b + (** Retrieve the result of a preprocessing phase, which possibly failed. + The [string] argument and the formatter are used to display a message in + case the preprocessing phase did not compute the required result. *) + + val pp_result: + (Format.formatter -> 'a -> unit) -> + Format.formatter -> + 'a result -> + unit + (** [pp_result pp] where [pp] is a formatter for ['a] returns a formatter for + ['a result]. *) +end + +(** Functor to build an [Error] module for a given [phase]. *) +module Make(P: sig val phase:Options.category end): S + +(** The [Error] module implements [Error.S] with no phase. *) +include S (* Local Variables: -compile-command: "make" +compile-command: "make -C ../../../../.." End: *) diff --git a/src/plugins/e-acsl/src/libraries/functions.ml b/src/plugins/e-acsl/src/libraries/functions.ml index 9602cd7e1bf0a065cc114f10ba69f0577569288c..1d44e2869d65e04aa2e28fe5ef6b0bcce3e32447 100644 --- a/src/plugins/e-acsl/src/libraries/functions.ml +++ b/src/plugins/e-acsl/src/libraries/functions.ml @@ -68,10 +68,6 @@ module RTL = struct (* prefix of temporal analysis functions of the public E-ACSL API *) let temporal_prefix = api_prefix ^ "temporal_" - (* prefix of all builtin functions/variables from the public E-ACSL API, - Builtin functions replace original calls in programs. *) - let e_acsl_builtin_prefix = api_prefix ^ "builtin_" - (* prefix of functions/variables generated by E-ACSL *) let e_acsl_gen_prefix = "__gen_e_acsl_" @@ -95,13 +91,6 @@ module RTL = struct let is_generated_literal_string_name name = startswith e_acsl_lit_string_prefix name - let libc_replacement_name fn = e_acsl_builtin_prefix ^ fn - - let has_rtl_replacement = function - | "strcpy" | "strncpy" | "strlen" | "strcat" | "strncat" | "strcmp" - | "strncmp" | "memcpy" | "memset" | "memcmp" | "memmove" -> true - | _ -> false - end (* ************************************************************************** *) @@ -110,6 +99,17 @@ end module Libc = struct + (* prefix of all builtin functions/variables from the public E-ACSL API, + Builtin functions replace original calls in programs. *) + let e_acsl_builtin_prefix = RTL.api_prefix ^ "builtin_" + + let has_replacement = function + | "strcpy" | "strncpy" | "strlen" | "strcat" | "strncat" | "strcmp" + | "strncmp" | "memcpy" | "memset" | "memcmp" | "memmove" -> true + | _ -> false + + let replacement_name fn = e_acsl_builtin_prefix ^ fn + let is_dyn_alloc_name name = name = "malloc" || name = "realloc" || name = "calloc" @@ -212,6 +212,15 @@ module Libc = struct end +module Concurrency = struct + let has_replacement fn = + match fn with + | "pthread_create" -> true + | _ -> false + + let replacement_name fn = RTL.api_prefix ^ fn +end + let check kf = (* [kf] is monitored iff all functions must be monitored or [kf] belongs to the white list *) diff --git a/src/plugins/e-acsl/src/libraries/functions.mli b/src/plugins/e-acsl/src/libraries/functions.mli index dbfbffe530e7ea8e737cce1c534a087045de99b4..f5d13814748405634280c4a4699852218dc893bf 100644 --- a/src/plugins/e-acsl/src/libraries/functions.mli +++ b/src/plugins/e-acsl/src/libraries/functions.mli @@ -73,14 +73,6 @@ module RTL: sig (** Retrieve the name of the kernel function and strip prefix that indicates that it has been generated by the instrumentation. *) - val libc_replacement_name: string -> string - (** Given the name of C library function return the name of the RTL function - that potentially replaces it. *) - - val has_rtl_replacement: string -> bool - (** Given the name of C library function return true if there is a drop-in - replacement function for it in the RTL. *) - end (* Rtl *) (* ************************************************************************** *) @@ -89,6 +81,14 @@ end (* Rtl *) module Libc: sig + val has_replacement: string -> bool + (** Given the name of C library function return true if there is a drop-in + replacement function for it in the RTL. *) + + val replacement_name: string -> string + (** Given the name of C library function return the name of the RTL function + that potentially replaces it. *) + val is_memcpy: exp -> bool (** Return [true] if [exp] captures a function name that matches [memcpy] or an equivalent function *) @@ -181,6 +181,20 @@ module Libc: sig end (* Libc *) +(* ************************************************************************** *) +(** {2 Concurrency} Operations concerning the support of concurrency *) +(* ************************************************************************** *) + +module Concurrency: sig + val has_replacement: string -> bool + (** Given the name of C library function return true if there is a drop-in + replacement function for it in the RTL. *) + + val replacement_name: string -> string + (** Given the name of C library function return the name of the RTL function + that potentially replaces it. *) +end (* Concurrency *) + (* Local Variables: compile-command: "make -C ../../../../.." diff --git a/src/plugins/e-acsl/src/libraries/misc.ml b/src/plugins/e-acsl/src/libraries/misc.ml index b39eb80446b5d3180f9552f94e586caab2a4a5be..8602698152a7ee7da54c4b1afb574fa85a5ac384 100644 --- a/src/plugins/e-acsl/src/libraries/misc.ml +++ b/src/plugins/e-acsl/src/libraries/misc.ml @@ -36,7 +36,7 @@ let is_fc_or_compiler_builtin vi = Datatype.String.equal prefix "__builtin_") || (Options.Replace_libc_functions.get () - && Functions.RTL.has_rtl_replacement vi.vname) + && Functions.Libc.has_replacement vi.vname) let is_fc_stdlib_generated vi = Cil.hasAttribute "fc_stdlib_generated" vi.vattr @@ -97,7 +97,7 @@ let rec ptr_base ~loc exp = | BinOp(op, lhs, _, _) -> (match op with (* Pointer arithmetic: split pointer and integer parts *) - | MinusPI | PlusPI | IndexPI -> ptr_base ~loc lhs + | MinusPI | PlusPI -> ptr_base ~loc lhs (* Other arithmetic: treat the whole expression as pointer address *) | MinusPP | PlusA | MinusA | Mult | Div | Mod | BAnd | BXor | BOr | Shiftlt | Shiftrt @@ -112,7 +112,6 @@ let rec ptr_base ~loc exp = let exp, casts = strip_casts exp in let base = ptr_base ~loc exp in add_casts casts base - | Info (exp, _) -> ptr_base ~loc exp | Const _ | Lval _ | UnOp _ -> exp | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ -> assert false @@ -211,7 +210,7 @@ let name_of_binop = function | Mult -> "mul" | PlusA -> "add" | MinusA -> "sub" - | MinusPP | MinusPI | IndexPI | PlusPI -> assert false + | MinusPP | MinusPI | PlusPI -> assert false module Id_term = Datatype.Make_with_collections diff --git a/src/plugins/e-acsl/src/main.ml b/src/plugins/e-acsl/src/main.ml index 60a853b3f1ac39512c85670c5d116f69d6e4d0b3..a050b44b6e0bfb6549cfe4063923a9ce4179c293 100644 --- a/src/plugins/e-acsl/src/main.ml +++ b/src/plugins/e-acsl/src/main.ml @@ -30,11 +30,6 @@ module Resulting_projects = let dependencies = Ast.self :: Options.parameter_states end) -let () = - State_dependency_graph.add_dependencies - ~from:Resulting_projects.self - [ Label.self ] - let generate_code = Resulting_projects.memo (fun name -> @@ -69,7 +64,13 @@ let generate_code = Kernel.SignedOverflow.unsafe_set signed; Kernel.UnsignedOverflow.unsafe_set unsigned in - Extlib.try_finally ~finally Injector.inject (); + Extlib.try_finally + ~finally + (fun () -> + Gmp_types.init (); + Analyses.preprocess (); + Injector.inject ()) + (); (* remove the RTE's results computed from E-ACSL: they are partial and associated with the wrong kernel function (the one of the old project). *) diff --git a/src/plugins/e-acsl/src/options.ml b/src/plugins/e-acsl/src/options.ml index 3aa05ca87e7c9a344e71eaad8dfcb5ca1759cfd1..7752a5ccf2c1812b52f3e6223842214650bec556 100644 --- a/src/plugins/e-acsl/src/options.ml +++ b/src/plugins/e-acsl/src/options.ml @@ -108,6 +108,14 @@ module Assert_print_data = the runtime error message" end) +module Concurrency = + False + (struct + let option_name = "-e-acsl-concurrency" + let help = "activate the concurrency support of E-ACSL. The option \ + implies -e-acsl-full-mtracking." + end) + module Functions = Kernel_function_set (struct @@ -172,10 +180,14 @@ let emitter = let must_visit () = Run.get () -let dkey_analysis = register_category "analysis" -let dkey_prepare = register_category "preparation" -let dkey_translation = register_category "translation" -let dkey_typing = register_category "typing" +module Dkey = struct + let prepare = register_category "preparation" + let bound_variables = register_category "analysis:bound_variables" + let interval = register_category "analysis:interval_inference" + let mtracking = register_category "analysis:memory_tracking" + let typing = register_category "analysis:typing" + let translation = register_category "translation" +end let setup ?(rtl=false) () = (* Variadic translation *) @@ -199,6 +211,28 @@ let setup ?(rtl=false) () = end end end; + (* Concurrency support *) + if Concurrency.get () then begin + if Full_mtracking.is_set () && not (Full_mtracking.get ()) then + abort + "The memory tracking dataflow analysis is incompatible@ \ + with the concurrency support of E-ACSL.@ \ + Please use option '-e-acsl-full-mtracking'."; + if not rtl && not (Full_mtracking.is_set ()) then + feedback + "Due to the large number of function pointers in concurrent@ \ + code, the memory tracking dataflow analysis is deactivated@ \ + when activating the concurrency support of E-ACSL."; + Full_mtracking.on (); + if Temporal_validity.get () then + abort + "The temporal analysis in valid annotations is incompatible@ \ + with the concurrency support of E-ACSL.@ \ + Please use '-e-acsl-no-temporal-validity' or '-e-acsl-no-concurrency'@ \ + to deactivate one or the other."; + if rtl then + Kernel.CppExtraArgs.add "-DE_ACSL_CONCURRENCY_PTHREAD" + end; (* Additionnal kernel options while parsing the RTL project. *) if rtl then begin Kernel.Keep_unused_specified_functions.off (); diff --git a/src/plugins/e-acsl/src/options.mli b/src/plugins/e-acsl/src/options.mli index 3274f5591f038349c5ff4543435049566e33a153..3fe0a48115f17cfdd0dcd6907429f8a54da6b37f 100644 --- a/src/plugins/e-acsl/src/options.mli +++ b/src/plugins/e-acsl/src/options.mli @@ -32,6 +32,7 @@ module Temporal_validity: Parameter_sig.Bool module Validate_format_strings: Parameter_sig.Bool module Replace_libc_functions: Parameter_sig.Bool module Assert_print_data: Parameter_sig.Bool +module Concurrency: Parameter_sig.Bool module Functions: Parameter_sig.Kernel_function_set module Instrument: Parameter_sig.Kernel_function_set @@ -41,10 +42,14 @@ val emitter: Emitter.t val must_visit: unit -> bool -val dkey_analysis: category -val dkey_prepare: category -val dkey_translation: category -val dkey_typing: category +module Dkey: sig + val prepare: category + val bound_variables: category + val interval: category + val mtracking: category + val typing: category + val translation: category +end val setup: ?rtl:bool -> unit -> unit (** Verify and initialize the options of the current project according to the diff --git a/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml b/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml index ff197b64c36ce46d2ffb60df5b229cf121d27bb4..4f0d951aca08aa973a6b84030f9be4549bb2a91e 100644 --- a/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml +++ b/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml @@ -23,7 +23,7 @@ open Cil_types open Cil_datatype -let dkey = Options.dkey_prepare +let dkey = Options.Dkey.prepare (**************************************************************************) (********************** Forward references ********************************) @@ -326,15 +326,131 @@ let require_alignment vi algn = (* Visiting the globals *) (* ********************************************************************** *) +(** Module for ensuring absence of term sharing *) +module Term_sharing: sig + val add: term -> unit + val mem: term -> bool + val clear: unit -> unit +end += +struct + let terms = Misc.Id_term.Hashtbl.create 7 + let add t = Misc.Id_term.Hashtbl.add terms t () + let mem t = Misc.Id_term.Hashtbl.mem terms t + let clear () = Misc.Id_term.Hashtbl.clear terms +end + +(** Module to move labels to an enclosing block *) +module Labeled_stmts: sig + (* [add_moved_stmt old new] records that the labels have been moved from + statement [old] to statement [new]. *) + val add_moved_stmt: stmt -> stmt -> unit + + (* [add_stmt_ref s_ref] adds the reference [s_ref] to the list of references + to update to the moved labeled statement. *) + val add_stmt_ref: stmt ref -> unit + + (* [add_stmt s] adds the statement [s] to the list of statements to update + so that inner statement fields are updated to the moved labeled + statements. *) + val add_stmt: stmt -> unit + + (* [set_fundec_has_label ()] sets the boolean indicating that the current + [fundec] has some labeled statements. *) + val set_fundec_has_label: unit -> unit + + (* [clear ()] clears the internal fields of the module. *) + val clear: unit -> unit + + (* [get_moved_stmt old], if [old] was a labeled statement, returns the new + statement where the labels have been moved, otherwise returns [old]. *) + val get_moved_stmt: stmt -> stmt + + (* [update_in_fundec fundec] updates the function [fundec] with the updated + labeled statements. *) + val update_in_fundec: fundec -> unit +end += +struct + (* Hold the association between the original statement with labels and the + statement where the labels have been moved. *) + let moved_labels: stmt Stmt.Hashtbl.t = Stmt.Hashtbl.create 17 + + (* List of [ref stmt] that need to be updated if they point to a labeled + statement. *) + let stmt_refs: stmt ref list ref = ref [] + + (* List of [stmt] containing other statements that need to be udpated if + they point to a labeled statement. *) + let stmts: stmt list ref = ref [] + + (* True if the current [fundec] had a label, false otherwise. *) + let fundec_has_label: bool ref = ref false + + let clear () = + Stmt.Hashtbl.clear moved_labels; + stmt_refs := []; + stmts := []; + fundec_has_label := false + + let add_moved_stmt stmt new_stmt = + Stmt.Hashtbl.add moved_labels stmt new_stmt + let add_stmt_ref s_ref = stmt_refs := s_ref :: !stmt_refs + let add_stmt s = stmts := s :: !stmts + let set_fundec_has_label () = fundec_has_label := true + + (* If the given statement had labels that have been moved, return the new + labeled statement, otherwise return the given statement. *) + let get_moved_stmt stmt = + try Stmt.Hashtbl.find moved_labels stmt + with Not_found -> stmt + + (* Visitor to update statements that contain labeled statements such as + [switch] or [loop]. *) + let stmt_updater = + object + inherit Visitor.frama_c_inplace + + method !vstmt_aux stmt = + match stmt.skind with + | Switch (e, b, slist, loc) -> + let slist = List.map get_moved_stmt slist in + stmt.skind <- Switch (e, b, slist, loc); + Cil.ChangeTo stmt + | Loop (ca, b, loc, cont_stmt_opt, brk_stmt_opt) -> + let continue_stmt_opt = + Option.map get_moved_stmt cont_stmt_opt + in + let break_stmt_opt = Option.map get_moved_stmt brk_stmt_opt in + stmt.skind <- Loop (ca, b, loc, continue_stmt_opt, break_stmt_opt); + Cil.ChangeTo stmt + | _ -> Cil.SkipChildren + end + + let update_in_fundec fundec = + (* Update all [ref stmt] retrieved with the visitor. *) + List.iter + (fun s_ref -> s_ref := get_moved_stmt !s_ref) + !stmt_refs; + (* Update all [stmt] retrieved with the visitor. *) + List.iter + (fun s -> + ignore @@ Visitor.visitFramacStmt stmt_updater s) + !stmts; + (* If a label was found in the function, update the CFG. *) + if !fundec_has_label then begin + Cfg.clearCFGinfo ~clear_id:false fundec; + Cfg.cfgFun fundec; + end + +end + (* perform a few modifications in the [kf]'s code and annotations that are required by E-ACSL's analyses and transformations *) let prepare_fundec kf = let o = object inherit Visitor.frama_c_inplace - (* table for ensuring absence of term sharing *) - val terms = Misc.Id_term.Hashtbl.create 7 - (* substitute function's varinfos by their duplicate in function calls *) method !vvrbl vi = try Cil.ChangeTo (Dup_functions.find vi) @@ -365,17 +481,77 @@ let prepare_fundec kf = method !vterm _ = Cil.DoChildrenPost (fun t -> - if Misc.Id_term.Hashtbl.mem terms t then + if Term_sharing.mem t then { t with term_node = t.term_node } else begin - Misc.Id_term.Hashtbl.add terms t (); + Term_sharing.add t; t end) method !videntified_predicate _ = (* when entering a new annotation, clear the context to keep it small: anyway, no sharing is possible between two identified predicates *) - Misc.Id_term.Hashtbl.clear terms; + Term_sharing.clear (); + Cil.DoChildren + + method !vfunc _ = + Labeled_stmts.clear (); + Cil.DoChildrenPost + (fun fundec -> + Labeled_stmts.update_in_fundec fundec; + fundec) + + method !vstmt_aux _ = + Cil.DoChildrenPost + (fun stmt -> + (* Save the [ref stmt] and [stmt] contained in the current stmt to + update them at the end of the function visit. *) + begin + match stmt.skind with + | Goto(s_ref, _) -> + Labeled_stmts.add_stmt_ref s_ref + | Switch _ | Loop _ -> + Labeled_stmts.add_stmt stmt + | UnspecifiedSequence seq -> + List.iter + (fun (_, _, _, _, s_ref_list) -> + List.iter + Labeled_stmts.add_stmt_ref + s_ref_list) + seq + | Instr (Asm (_, _, extasm_opt, _)) -> + Option.iter + (function { asm_gotos } -> + List.iter + Labeled_stmts.add_stmt_ref + asm_gotos) + extasm_opt + | _ -> () + end; + (* If the current statement has labels, create an enclosing block and + move the labels to it. *) + match stmt.labels with + | [] -> stmt + | _ :: _ -> + let labels = stmt.labels in + let new_stmt = + Cil.mkStmt ~valid_sid:true (Block (Cil.mkBlock [ stmt ])) + in + stmt.labels <- []; + new_stmt.labels <- labels; + Labeled_stmts.set_fundec_has_label (); + Labeled_stmts.add_moved_stmt stmt new_stmt; + new_stmt) + + method !vlogic_label ll = + (* Since the logic labels can only reference previous labels, we can + update the [ref stmt] of [StmtLabel] directly here. *) + begin + match ll with + | StmtLabel s_ref -> + s_ref := Labeled_stmts.get_moved_stmt !s_ref; + | BuiltinLabel _ | FormalLabel _ -> () + end; Cil.DoChildren end in diff --git a/src/plugins/e-acsl/src/project_initializer/prepare_ast.mli b/src/plugins/e-acsl/src/project_initializer/prepare_ast.mli index 6b504898c74bcdbf83ecac94fc9fe834dec6c6b5..6fae22c89968c800020dbb86d0d751036f452958 100644 --- a/src/plugins/e-acsl/src/project_initializer/prepare_ast.mli +++ b/src/plugins/e-acsl/src/project_initializer/prepare_ast.mli @@ -26,7 +26,10 @@ - generating a new definition for functions with contract; - removing term sharing; - in case of temporal validity checks, adding the attribute "aligned" to - variables that are not sufficiently aligned. *) + variables that are not sufficiently aligned; + - create a block around a labeled statement to hold the labels so that the + code generation does not need to change the statement holding the label. +*) open Cil_types diff --git a/src/plugins/e-acsl/src/project_initializer/rtl.ml b/src/plugins/e-acsl/src/project_initializer/rtl.ml index 671e517c3f12456093f38f4e994f203da23a2213..092dc9b45e00d4c8e95d5edf547b1ed7d896e58f 100644 --- a/src/plugins/e-acsl/src/project_initializer/rtl.ml +++ b/src/plugins/e-acsl/src/project_initializer/rtl.ml @@ -51,7 +51,7 @@ module Symbols: sig val mem_vi: string -> bool exception Unregistered of string val find_vi: string -> varinfo (* may raise Unregistered *) - val libc_replacement: varinfo -> varinfo + val replacement: get_name:(string -> string) -> varinfo -> varinfo val _debug: unit -> unit end = struct @@ -74,13 +74,13 @@ end = struct try Datatype.String.Hashtbl.find vars s with Not_found -> raise (Unregistered s) - let libc_replacement fvi = - let name = Functions.RTL.libc_replacement_name fvi.vorig_name in + let replacement ~get_name fvi = + let name = get_name fvi.vorig_name in try find_vi name with Unregistered _ -> Options.fatal - "Unable to find RTL function '%s' to replace libc function '%s'" + "Unable to find RTL function '%s' to replace function '%s'" name fvi.vname diff --git a/src/plugins/e-acsl/src/project_initializer/rtl.mli b/src/plugins/e-acsl/src/project_initializer/rtl.mli index c864353d59a668abb4cf49d5de0c190fad32ee8d..684d63b9bbfd8f5f95fb3b6d7c9827879665bca0 100644 --- a/src/plugins/e-acsl/src/project_initializer/rtl.mli +++ b/src/plugins/e-acsl/src/project_initializer/rtl.mli @@ -39,9 +39,10 @@ module Symbols: sig val find_vi: string -> varinfo (** @raise Unregistered if the given name is not part of the RTL. *) - val libc_replacement: varinfo -> varinfo - (** Given the varinfo of a C library function with an RTL replacement, return - the varinfo of the RTL function that replaces it. *) + val replacement: get_name:(string -> string) -> varinfo -> varinfo + (** Given the varinfo of a C function with an RTL replacement, return + the varinfo of the RTL function that replaces it. The function + [get_name] is used to find the name of the RTL replacement. *) end (* diff --git a/src/plugins/e-acsl/tests/arith/oracle/at.res.oracle b/src/plugins/e-acsl/tests/arith/oracle/at.res.oracle index 95c57008f70680c17634116d1260598d94fe6d0e..f3865d1f2f042441bd3124fed3575f1b75e91b29 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/at.res.oracle +++ b/src/plugins/e-acsl/tests/arith/oracle/at.res.oracle @@ -21,7 +21,7 @@ function __e_acsl_assert_register_ulong: precondition data->values == \null || \valid(data->values) got status unknown. [eva:alarm] at.i:29: Warning: assertion got status unknown. -[eva:alarm] at.i:31: Warning: assertion got status unknown. [eva:alarm] at.i:31: Warning: function __e_acsl_assert_register_ulong: precondition data->values == \null || \valid(data->values) got status unknown. +[eva:alarm] at.i:31: Warning: assertion got status unknown. diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_arith.c b/src/plugins/e-acsl/tests/arith/oracle/gen_arith.c index 212101ddb6857dcaf5c0795516b0428f84c1ffa9..aa0c98f30f9b4a2d070d597e59699f9e2f90e58d 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_arith.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_arith.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_array.c b/src/plugins/e-acsl/tests/arith/oracle/gen_array.c index 1a12d918feae2f6b492a78c5447024935bbffb04..846ffae0ba569640d2baf6e4b1111c25313a6382 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_array.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_array.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int T1[3]; diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_at.c b/src/plugins/e-acsl/tests/arith/oracle/gen_at.c index 4f7fb6cc245a486f235b04a5b9bc4074b3a93fe7..066ff02534b01e2da3a06e7c3bbc41a7718a2f35 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_at.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_at.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int A = 0; @@ -177,26 +181,25 @@ void g(int *p, int *q) { __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, - "\\at(*(p + \\at(*q,__invalid_label)),L2)", - 0,__gen_e_acsl_at_2); + "\\at(*(p + \\at(*q,L1)),L2)",0, + __gen_e_acsl_at_2); __gen_e_acsl_assert_data.blocking = 1; __gen_e_acsl_assert_data.kind = "Assertion"; - __gen_e_acsl_assert_data.pred_txt = "\\at(*(p + \\at(*q,__invalid_label)),L2) == 2"; + __gen_e_acsl_assert_data.pred_txt = "\\at(*(p + \\at(*q,L1)),L2) == 2"; __gen_e_acsl_assert_data.file = "at.i"; __gen_e_acsl_assert_data.fct = "g"; __gen_e_acsl_assert_data.line = 29; __e_acsl_assert(__gen_e_acsl_at_2 == 2,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } - /*@ assert \at(*(p + \at(*q,__invalid_label)),L2) == 2; */ ; + /*@ assert \at(*(p + \at(*q,L1)),L2) == 2; */ ; L3: - /*@ assert \at(*(p + \at(*q,__invalid_label)),Here) == 2; */ { int __gen_e_acsl_valid_read_4; __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = {.values = (void *)0}; __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, - "*(p + \\at(*q,__invalid_label))",0, + "*(p + \\at(*q,L1))",0, *(p + __gen_e_acsl_at_3)); __e_acsl_assert_data_t __gen_e_acsl_assert_data_6 = {.values = (void *)0}; @@ -218,7 +221,7 @@ void g(int *p, int *q) __e_acsl_assert_clean(& __gen_e_acsl_assert_data_6); __gen_e_acsl_assert_data_4.blocking = 1; __gen_e_acsl_assert_data_4.kind = "Assertion"; - __gen_e_acsl_assert_data_4.pred_txt = "\\at(*(p + \\at(*q,__invalid_label)),Here) == 2"; + __gen_e_acsl_assert_data_4.pred_txt = "\\at(*(p + \\at(*q,L1)),Here) == 2"; __gen_e_acsl_assert_data_4.file = "at.i"; __gen_e_acsl_assert_data_4.fct = "g"; __gen_e_acsl_assert_data_4.line = 31; @@ -226,6 +229,7 @@ void g(int *p, int *q) & __gen_e_acsl_assert_data_4); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); } + /*@ assert \at(*(p + \at(*q,L1)),Here) == 2; */ ; __e_acsl_delete_block((void *)(& q)); __e_acsl_delete_block((void *)(& p)); return; @@ -255,7 +259,6 @@ int main(void) __e_acsl_full_init((void *)(& x)); x = __gen_e_acsl_h(0); L: - /*@ assert x == 0; */ { __gen_e_acsl_at_3 = (long)x; __gen_e_acsl_at_2 = x + 1L; @@ -273,6 +276,7 @@ int main(void) __e_acsl_assert(x == 0,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } + /*@ assert x == 0; */ ; } __e_acsl_full_init((void *)(& x)); x = 1; @@ -282,43 +286,41 @@ int main(void) { __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = {.values = (void *)0}; - __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, - "\\at(x,__invalid_label)",0,__gen_e_acsl_at); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\at(x,L)",0, + __gen_e_acsl_at); __gen_e_acsl_assert_data_2.blocking = 1; __gen_e_acsl_assert_data_2.kind = "Assertion"; - __gen_e_acsl_assert_data_2.pred_txt = "\\at(x,__invalid_label) == 0"; + __gen_e_acsl_assert_data_2.pred_txt = "\\at(x,L) == 0"; __gen_e_acsl_assert_data_2.file = "at.i"; __gen_e_acsl_assert_data_2.fct = "main"; __gen_e_acsl_assert_data_2.line = 54; __e_acsl_assert(__gen_e_acsl_at == 0,& __gen_e_acsl_assert_data_2); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); } - /*@ assert \at(x,__invalid_label) == 0; */ ; + /*@ assert \at(x,L) == 0; */ ; { __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = {.values = (void *)0}; __e_acsl_assert_register_long(& __gen_e_acsl_assert_data_3, - "\\at(x + 1,__invalid_label)",0, - __gen_e_acsl_at_2); + "\\at(x + 1,L)",0,__gen_e_acsl_at_2); __gen_e_acsl_assert_data_3.blocking = 1; __gen_e_acsl_assert_data_3.kind = "Assertion"; - __gen_e_acsl_assert_data_3.pred_txt = "\\at(x + 1,__invalid_label) == 1"; + __gen_e_acsl_assert_data_3.pred_txt = "\\at(x + 1,L) == 1"; __gen_e_acsl_assert_data_3.file = "at.i"; __gen_e_acsl_assert_data_3.fct = "main"; __gen_e_acsl_assert_data_3.line = 55; __e_acsl_assert(__gen_e_acsl_at_2 == 1L,& __gen_e_acsl_assert_data_3); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); } - /*@ assert \at(x + 1,__invalid_label) == 1; */ ; + /*@ assert \at(x + 1,L) == 1; */ ; { __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = {.values = (void *)0}; - __e_acsl_assert_register_long(& __gen_e_acsl_assert_data_4, - "\\at(x,__invalid_label)",0, + __e_acsl_assert_register_long(& __gen_e_acsl_assert_data_4,"\\at(x,L)",0, __gen_e_acsl_at_3); __gen_e_acsl_assert_data_4.blocking = 1; __gen_e_acsl_assert_data_4.kind = "Assertion"; - __gen_e_acsl_assert_data_4.pred_txt = "\\at(x,__invalid_label) + 1 == 1"; + __gen_e_acsl_assert_data_4.pred_txt = "\\at(x,L) + 1 == 1"; __gen_e_acsl_assert_data_4.file = "at.i"; __gen_e_acsl_assert_data_4.fct = "main"; __gen_e_acsl_assert_data_4.line = 56; @@ -326,7 +328,7 @@ int main(void) & __gen_e_acsl_assert_data_4); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); } - /*@ assert \at(x,__invalid_label) + 1 == 1; */ ; + /*@ assert \at(x,L) + 1 == 1; */ ; g(t,& x); __retres = 0; __e_acsl_delete_block((void *)(t)); diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_at_on-purely-logic-variables.c b/src/plugins/e-acsl/tests/arith/oracle/gen_at_on-purely-logic-variables.c index ed0eabf3fb0624b6bfc391429e4c4178850d46f7..1699106744e35573412ee834ea018a959c57737b 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_at_on-purely-logic-variables.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_at_on-purely-logic-variables.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ ensures diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_bitwise.c b/src/plugins/e-acsl/tests/arith/oracle/gen_bitwise.c index 8219b6d79a945235fcfb063cc190e6e58c8349fa..0b5a01d1e28f5de731368df4c7620c86e2329e65 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_bitwise.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_bitwise.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; void f_signed(int a, int b) diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_cast.c b/src/plugins/e-acsl/tests/arith/oracle/gen_cast.c index 7c770a12fdb8d95ebf5f3ec881194e869721e8e2..9528698b9d91328d2608f4db779a8351c78da9d7 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_cast.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_cast.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_comparison.c b/src/plugins/e-acsl/tests/arith/oracle/gen_comparison.c index 12ab6a4915937c2ec87e99701f6180f2c29951ef..0aff0e2c744bd1cd03a12e73baeef372abc4eab7 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_comparison.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_comparison.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_extended_quantifiers.c b/src/plugins/e-acsl/tests/arith/oracle/gen_extended_quantifiers.c index acb1ffa950115331385d6250ca8082596733fb5c..3bd32e0bc30b1aaefdb3c8e82303c15af738d7ed 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_extended_quantifiers.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_extended_quantifiers.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_functions.c b/src/plugins/e-acsl/tests/arith/oracle/gen_functions.c index a348a167ad094952601288f5e99a4cac595329da..c8d40b091b95658d8648aa2d13d72ad5c5092f97 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_functions.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_functions.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct mystruct { diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_functions_rec.c b/src/plugins/e-acsl/tests/arith/oracle/gen_functions_rec.c index 9687af6f6d2e250f5e2ee3aefccef1b536ca20b9..17591b47b23fa4e3491951cca0958866517e46b8 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_functions_rec.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_functions_rec.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ logic integer f1(integer n) = n <= 0? 0: f1(n - 1) + n; diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_integer_constant.c b/src/plugins/e-acsl/tests/arith/oracle/gen_integer_constant.c index a81ec0a72bc111392c62b6a5cfce9eba481687e7..94b8940d0169f8d1a4f7bc778e5f3db0cad3d8e0 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_integer_constant.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_integer_constant.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_let.c b/src/plugins/e-acsl/tests/arith/oracle/gen_let.c index 83748d2c488f0ee30ee9722474150f99e1751a9c..439187eb639e5f3aaa9a46de1419ad6479eacbac 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_let.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_let.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct __anonstruct_r_1 { diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_longlong.c b/src/plugins/e-acsl/tests/arith/oracle/gen_longlong.c index 046cf7761b1a60316581e07ac8ea2297c410597b..801f24611f78dc26b779c7b7eac09089c6a6d038 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_longlong.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_longlong.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; unsigned long long my_pow(unsigned int x, unsigned int n) diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_not.c b/src/plugins/e-acsl/tests/arith/oracle/gen_not.c index 91dd1e50405fc6262a3a461c2be89abf79d94672..b665a1b486ffd039813f4d6e9a83e1df54557db9 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_not.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_not.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_quantif.c b/src/plugins/e-acsl/tests/arith/oracle/gen_quantif.c index 0e377eec08ea5aa692f88b071cb6ed10b08665bf..75abc2f33cc0be39d10d2846c99abacc103359a4 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_quantif.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_quantif.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_rationals.c b/src/plugins/e-acsl/tests/arith/oracle/gen_rationals.c index ebe5eeb992a2f818dc53cde5f7501d195f186b06..189169fa1e0f2750dae762e7b894217bf8d20c39 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/gen_rationals.c +++ b/src/plugins/e-acsl/tests/arith/oracle/gen_rationals.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ ensures \let delta = 1; diff --git a/src/plugins/e-acsl/tests/bts/bts1386_complex_flowgraph.c b/src/plugins/e-acsl/tests/bts/bts1386_complex_flowgraph.c index 11a259f7b28b1791a94fc87874ac7d27c9be0b4a..6dd76f26cdffd97a538790a2ff90682904ee3774 100644 --- a/src/plugins/e-acsl/tests/bts/bts1386_complex_flowgraph.c +++ b/src/plugins/e-acsl/tests/bts/bts1386_complex_flowgraph.c @@ -1,3 +1,7 @@ +/* run.config + STDOPT: #"-eva-slevel 5" +*/ + /* MDH WCET BENCHMARK SUITE. File version $Id: duff.c,v 1.4 2005/12/21 09:43:07 jgn Exp $ */ /*---------------------------------------------------------------------- diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1304.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1304.c index 1a051ea1ff93b02c918e091e01898f045a93e347..7147183bf3fb157f75309747efb00303eb685093 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1304.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1304.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct msgA { diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1307.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1307.c index 6de1d5a249ff3490ef0c6296881ea1b56e49476b..a8d8958a0836921dd2a50bca4212d853b27f35f7 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1307.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1307.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ requires \valid(Mtmax_in); diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1324.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1324.c index c627510756a9df54c4efe2ff87d4c75dbc3b9ed6..7cae1c93f16f23709220e231bce6b4b0b26548de 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1324.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1324.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ behavior yes: diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1326.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1326.c index 5ce943f9ae54e1de78dfe1d9729f44ef5e38e2e8..47aa6ede8b74bf374464abfae3ed8904b9bc878b 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1326.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1326.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; typedef int ArrayInt[5]; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1386_complex_flowgraph.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1386_complex_flowgraph.c index 3b3f0b60cae7b496dec1484fc541a33d35d386c1..0082fd032004bcf32f5972821b5db71d45e642ea 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1386_complex_flowgraph.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1386_complex_flowgraph.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; void duffcopy(char *to, char *from, int count) @@ -53,7 +57,8 @@ void duffcopy(char *to, char *from, int count) from ++; __e_acsl_initialize((void *)tmp,sizeof(char)); *tmp = *tmp_0; - case 7: __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); + case 7: + __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_0),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_1),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_2),(size_t)8); @@ -77,7 +82,8 @@ void duffcopy(char *to, char *from, int count) from ++; __e_acsl_initialize((void *)tmp_1,sizeof(char)); *tmp_1 = *tmp_2; - case 6: __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); + case 6: + __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_0),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_1),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_2),(size_t)8); @@ -101,7 +107,8 @@ void duffcopy(char *to, char *from, int count) from ++; __e_acsl_initialize((void *)tmp_3,sizeof(char)); *tmp_3 = *tmp_4; - case 5: __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); + case 5: + __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_0),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_1),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_2),(size_t)8); @@ -125,7 +132,8 @@ void duffcopy(char *to, char *from, int count) from ++; __e_acsl_initialize((void *)tmp_5,sizeof(char)); *tmp_5 = *tmp_6; - case 4: __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); + case 4: + __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_0),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_1),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_2),(size_t)8); @@ -149,7 +157,8 @@ void duffcopy(char *to, char *from, int count) from ++; __e_acsl_initialize((void *)tmp_7,sizeof(char)); *tmp_7 = *tmp_8; - case 3: __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); + case 3: + __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_0),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_1),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_2),(size_t)8); @@ -173,7 +182,8 @@ void duffcopy(char *to, char *from, int count) from ++; __e_acsl_initialize((void *)tmp_9,sizeof(char)); *tmp_9 = *tmp_10; - case 2: __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); + case 2: + __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_0),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_1),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_2),(size_t)8); @@ -197,7 +207,8 @@ void duffcopy(char *to, char *from, int count) from ++; __e_acsl_initialize((void *)tmp_11,sizeof(char)); *tmp_11 = *tmp_12; - case 1: __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); + case 1: + __e_acsl_store_block_duplicate((void *)(& tmp),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_0),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_1),(size_t)8); __e_acsl_store_block_duplicate((void *)(& tmp_2),(size_t)8); diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1390.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1390.c index 6c3591f28b840cbe06dfcdcb194a427a3e50c587..710fec08e42caa39f84a807d8956b3239843923d 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1390.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1390.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" char *__gen_e_acsl_literal_string; char *__gen_e_acsl_literal_string_2; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; @@ -45,12 +49,10 @@ void *memchr(void const *buf, int c, size_t n) __e_acsl_full_init((void *)(& __retres)); __retres = (void *)0; return_label: - { - __e_acsl_delete_block((void *)(& buf)); - __e_acsl_delete_block((void *)(& s)); - __e_acsl_delete_block((void *)(& __retres)); - return __retres; - } + __e_acsl_delete_block((void *)(& buf)); + __e_acsl_delete_block((void *)(& s)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; } /*@ behavior exists: diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1395.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1395.c index eda1d2a203d7043138a9e2c68a40b34db34f04f3..00d4049eb3b4771a7d6468aff3805454442b883f 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1395.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1395.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ requires n > 0; */ diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1398.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1398.c index 62eedb96d6bb73d9aea151b013a92e4c9730d051..2163ee05001e007cc64e7802c022d44572c85612 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1398.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1398.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1399.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1399.c index e04d53948c72568b0f0cb4abecfa5acb0d319500..7dc0ef31c0a22023b67914d2c638aac4b3715c57 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1399.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1399.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct spongeStateStruct { diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1478.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1478.c index 82244b59ed0706b186bcf2abfe811edb17dc954a..ccc94a40bda3569e1f37362f0ab6e0c2a3bf9cf8 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1478.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1478.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int global_i; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1700.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1700.c index bc5c216685d564133e0581dc56668a1a3963d58b..74eed7516c5e1ac0a905ea2728db8e6dd35663c0 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1700.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1700.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct toto { diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1717.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1717.c index 679638429bf0740ad472b7bcb2f95911510dfbde..6479ce655494794c9c7e30c795a6b8ab7666332e 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1717.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1717.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) @@ -15,7 +19,6 @@ int main(void) __e_acsl_full_init((void *)(& a)); goto lbl_1; lbl_2: - /*@ assert \valid(p); */ { int __gen_e_acsl_initialized; int __gen_e_acsl_and; @@ -50,12 +53,11 @@ int main(void) __e_acsl_assert(__gen_e_acsl_and,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } + /*@ assert \valid(p); */ ; __retres = 0; goto return_label; - lbl_1: { - __e_acsl_full_init((void *)(& p)); - p = & a; - } + lbl_1: __e_acsl_full_init((void *)(& p)); + p = & a; goto lbl_2; return_label: { diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1718.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1718.c index 3518e92ae1544e92f0d8339847f9e1d2ce9d4dd8..23f2cb2d589057594598230f68881c19fb4b07fe 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1718.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1718.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) @@ -15,7 +19,6 @@ int main(void) __e_acsl_full_init((void *)(& a)); goto lbl_1; lbl_2: - /*@ assert \valid(p); */ { int __gen_e_acsl_initialized; int __gen_e_acsl_and; @@ -50,12 +53,11 @@ int main(void) __e_acsl_assert(__gen_e_acsl_and,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } + /*@ assert \valid(p); */ ; __retres = 0; goto return_label; - lbl_1: { - __e_acsl_full_init((void *)(& p)); - p = & a; - } + lbl_1: __e_acsl_full_init((void *)(& p)); + p = & a; goto lbl_2; return_label: { diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1740.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1740.c index 28c44026f525aa813af90011d6f32beae8a42131..b233499a4907e9e9f8098c7c3df2e9f524dcedd0 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1740.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1740.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) @@ -58,7 +62,6 @@ int main(void) __e_acsl_delete_block((void *)(& a)); } L: - /*@ assert !\valid(p); */ { int __gen_e_acsl_initialized_2; int __gen_e_acsl_and_2; @@ -96,6 +99,7 @@ int main(void) __e_acsl_assert(! __gen_e_acsl_and_2,& __gen_e_acsl_assert_data_2); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); } + /*@ assert !\valid(p); */ ; __retres = 0; __e_acsl_delete_block((void *)(& p)); __e_acsl_memory_clean(); diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1837.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1837.c index 14fe026050af6b7dc7060b635c56b09f0e8a0d8f..75bbcf73b86380749c65849578a0f5d188a75217 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1837.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1837.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string_3; char *__gen_e_acsl_literal_string; char *__gen_e_acsl_literal_string_2; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2191.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2191.c index 035f78c3fc38d515ced9c129b4393bad4b16dfab..0f8a6d0b54f5175d807a7f39c78235c3da7cf08d 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2191.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2191.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string; char *__gen_e_acsl_literal_string_2; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2192.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2192.c index f265fe806dd9486d28826d5730133fd5fe7e4a74..227bd74e634a1ff44225cafd4f84bb8c7c6d4fa7 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2192.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2192.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2231.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2231.c index 39c3fe19b40d205a6bf1d4d5e57a5b889ec9d2aa..9adaa695ef7e0d34aaf54f7f06f7d0a0298fdd50 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2231.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2231.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; long A = (long)0; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2252.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2252.c index a88823cd14e782bc57bd5f2bc98b7ac39559d5fa..5b56c7b5979771ac33f335e0a38890919c926440 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2252.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2252.c @@ -1,9 +1,13 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" #include "string.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2305.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2305.c index 1eb6cb65ad02597b2a440e03249f1038c807b386..1e8760b7779f440f9329e0e91cca4831d1cd4572 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2305.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2305.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct bitfields { diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2386.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2386.c index 339840301f25a43375423af1ae81cadd37297590..3938fa0647bc5d7c1ac0a0a14d118d80c1912513 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2386.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2386.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2406.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2406.c index b40a5fcdada63301b07765743987ff8b4d53d5bb..9591977d2fcaea4e7de01b1e2fb43075d11df682 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts2406.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts2406.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; char const tab[]; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-105.c b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-105.c index 348759fa8814b8a21f37762674d3819366e09595..34d4bc63358470c6503edc1afc1346353d95567b 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-105.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-105.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int f(void) @@ -12,7 +16,6 @@ int f(void) __e_acsl_full_init((void *)(& a)); goto lbl_1; lbl_2: - /*@ assert \valid(&a); */ { int __gen_e_acsl_valid; __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; @@ -33,6 +36,7 @@ int f(void) __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } + /*@ assert \valid(&a); */ ; __retres = 0; goto return_label; lbl_1: goto lbl_2; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-139.c b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-139.c index 9e2f9f27c84a169ea19b635728a018602d9f3410..5cbf4dba8918a54d942a4b1241e5171f0263c14e 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-139.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-139.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct X { diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-145.c b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-145.c index 00818f7ac27b45ca542ffca650e6e8ff018ecd84..21d386c35a334b7a84bbfd5b05a36ec831084cb0 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-145.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-145.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int G = 0; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-149.c b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-149.c index 659ae732c9e96c29f77ae9f536d907e805e82f09..2b0a6cbcfe125caa947ea9779e20b9bd0ab0febf 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-149.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-149.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(int argc, char **argv) diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-172.c b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-172.c index 0ac1d0b373873e7b867fd969e4b97aebbdb843a7..b5bfe70ceb3555c37648c67d06eacd2a48c682c9 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-172.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-172.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; double d2 = 11.; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-177.c b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-177.c index 83bccaff91c253711998908e68ae3fc96c26c690..f758e49b2b411017559a41216c7cb8a98b87fe05 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-177.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-177.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-187.c b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-187.c index 55c3a6fbcff89531691815b979fa47e5ea08d25f..1b194d5d86dff9e9d2f06653da503a81f280a792 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-187.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-187.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-40.c b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-40.c index 9a7cacf6e52e1095ac5865b2efdeac5e54f67717..511fbd1ea646ed873f01ea969034ad032f918eaf 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-40.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-40.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string; char *__gen_e_acsl_literal_string_2; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-91.c b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-91.c index a547dad399d3fad6dd02badaeff16b05d18d4c43..40c85c745e4dadb1643a406e3cd193bfd019876f 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-91.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-91.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; short a; @@ -13,7 +17,8 @@ char b(void) int c = 0; __e_acsl_store_block((void *)(& c),(size_t)4); __e_acsl_full_init((void *)(& c)); - case 0: __e_acsl_store_block_duplicate((void *)(& c),(size_t)4); + case 0: + __e_acsl_store_block_duplicate((void *)(& c),(size_t)4); __e_acsl_delete_block((void *)(& c)); goto d; int tmp = c; @@ -22,10 +27,8 @@ char b(void) __e_acsl_delete_block((void *)(& tmp)); __e_acsl_delete_block((void *)(& c)); } - d: { - __e_acsl_full_init((void *)(& __retres)); - __retres = (char)2; - } + d: __e_acsl_full_init((void *)(& __retres)); + __retres = (char)2; __e_acsl_delete_block((void *)(& __retres)); return __retres; } diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_issue69.c b/src/plugins/e-acsl/tests/bts/oracle/gen_issue69.c index af2166dc7be367d9e9dde0cc53293665ab18fa1b..a6e1c019f5283f5a1b0dd7c0830eaf1c45ea2c20 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_issue69.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_issue69.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_builtin_literal_string.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_builtin_literal_string.c index 34edaef3d580b28d2270027e2fe08f1a2e01b101..d02f4b691460013a7c6a35d905f8d1720fc4ea61 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/gen_builtin_literal_string.c +++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_builtin_literal_string.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "string.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_builtin_literal_string_local_init.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_builtin_literal_string_local_init.c index 55d378e45483e210528e4f7e92c8f05702072b08..853a9641d8d94beb8bfc807266f7ca2452044f9e 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/gen_builtin_literal_string_local_init.c +++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_builtin_literal_string_local_init.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "string.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcat.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcat.c index 1c95f09bf73480d5684cfa49940cc34453c8cdbc..668633df81ecadb142ae0b99de4d18d2f2f53624 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcat.c +++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcat.c @@ -1,4 +1,6 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" #include "signal.h" #include "stddef.h" #include "stdint.h" @@ -9,6 +11,7 @@ #include "sys/time.h" #include "sys/types.h" #include "sys/wait.h" +#include "time.h" #include "unistd.h" char *__gen_e_acsl_literal_string_27; char *__gen_e_acsl_literal_string_26; @@ -728,7 +731,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data.pred_txt = "stat_loc_non_null: valid_stat_loc: \\valid(stat_loc)"; __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data.fct = "waitpid"; - __gen_e_acsl_assert_data.line = 92; + __gen_e_acsl_assert_data.line = 95; __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } @@ -755,7 +758,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data_2.pred_txt = "result_ok_or_error: \\result == -1 || \\result >= 0"; __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data_2.fct = "waitpid"; - __gen_e_acsl_assert_data_2.line = 84; + __gen_e_acsl_assert_data_2.line = 87; __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = @@ -788,7 +791,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data_3.pred_txt = "initialization: stat_loc_init_on_success:\n \\result >= 0 && \\old(stat_loc) != \\null ==> \\initialized(\\old(stat_loc))"; __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data_3.fct = "waitpid"; - __gen_e_acsl_assert_data_3.line = 86; + __gen_e_acsl_assert_data_3.line = 89; __e_acsl_assert(__gen_e_acsl_implies,& __gen_e_acsl_assert_data_3); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); __e_acsl_contract_clean(__gen_e_acsl_contract); diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcmp.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcmp.c index 34c9f132beba3a64708f52e4705daee7fb7a92a4..bea2c5f790925e1785e617be9e5d24b577c5cb1b 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcmp.c +++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcmp.c @@ -1,4 +1,6 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" #include "signal.h" #include "stddef.h" #include "stdint.h" @@ -9,6 +11,7 @@ #include "sys/time.h" #include "sys/types.h" #include "sys/wait.h" +#include "time.h" #include "unistd.h" char *__gen_e_acsl_literal_string_32; char *__gen_e_acsl_literal_string_31; @@ -268,7 +271,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data.pred_txt = "stat_loc_non_null: valid_stat_loc: \\valid(stat_loc)"; __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data.fct = "waitpid"; - __gen_e_acsl_assert_data.line = 92; + __gen_e_acsl_assert_data.line = 95; __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } @@ -295,7 +298,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data_2.pred_txt = "result_ok_or_error: \\result == -1 || \\result >= 0"; __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data_2.fct = "waitpid"; - __gen_e_acsl_assert_data_2.line = 84; + __gen_e_acsl_assert_data_2.line = 87; __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = @@ -328,7 +331,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data_3.pred_txt = "initialization: stat_loc_init_on_success:\n \\result >= 0 && \\old(stat_loc) != \\null ==> \\initialized(\\old(stat_loc))"; __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data_3.fct = "waitpid"; - __gen_e_acsl_assert_data_3.line = 86; + __gen_e_acsl_assert_data_3.line = 89; __e_acsl_assert(__gen_e_acsl_implies,& __gen_e_acsl_assert_data_3); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); __e_acsl_contract_clean(__gen_e_acsl_contract); diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcpy.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcpy.c index 18295663672294403e180049e24654af482ebd96..3a7d9c056021dd1e8b3bd2b767a21f50c4b2da2c 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcpy.c +++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcpy.c @@ -1,4 +1,6 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" #include "signal.h" #include "stddef.h" #include "stdint.h" @@ -9,6 +11,7 @@ #include "sys/time.h" #include "sys/types.h" #include "sys/wait.h" +#include "time.h" #include "unistd.h" char *__gen_e_acsl_literal_string_24; char *__gen_e_acsl_literal_string_23; @@ -702,7 +705,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data.pred_txt = "stat_loc_non_null: valid_stat_loc: \\valid(stat_loc)"; __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data.fct = "waitpid"; - __gen_e_acsl_assert_data.line = 92; + __gen_e_acsl_assert_data.line = 95; __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } @@ -729,7 +732,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data_2.pred_txt = "result_ok_or_error: \\result == -1 || \\result >= 0"; __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data_2.fct = "waitpid"; - __gen_e_acsl_assert_data_2.line = 84; + __gen_e_acsl_assert_data_2.line = 87; __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = @@ -762,7 +765,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data_3.pred_txt = "initialization: stat_loc_init_on_success:\n \\result >= 0 && \\old(stat_loc) != \\null ==> \\initialized(\\old(stat_loc))"; __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data_3.fct = "waitpid"; - __gen_e_acsl_assert_data_3.line = 86; + __gen_e_acsl_assert_data_3.line = 89; __e_acsl_assert(__gen_e_acsl_implies,& __gen_e_acsl_assert_data_3); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); __e_acsl_contract_clean(__gen_e_acsl_contract); diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_strlen.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_strlen.c index 3a832d675a1e42a186e5034d6a7d03154b7cb5bb..9db1342beab0234cb08980195ca1b789f405f9ae 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/gen_strlen.c +++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_strlen.c @@ -1,4 +1,6 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" #include "signal.h" #include "stddef.h" #include "stdint.h" @@ -9,6 +11,7 @@ #include "sys/time.h" #include "sys/types.h" #include "sys/wait.h" +#include "time.h" #include "unistd.h" char *__gen_e_acsl_literal_string_8; char *__gen_e_acsl_literal_string_7; @@ -242,7 +245,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data.pred_txt = "stat_loc_non_null: valid_stat_loc: \\valid(stat_loc)"; __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data.fct = "waitpid"; - __gen_e_acsl_assert_data.line = 92; + __gen_e_acsl_assert_data.line = 95; __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } @@ -269,7 +272,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data_2.pred_txt = "result_ok_or_error: \\result == -1 || \\result >= 0"; __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data_2.fct = "waitpid"; - __gen_e_acsl_assert_data_2.line = 84; + __gen_e_acsl_assert_data_2.line = 87; __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = @@ -302,7 +305,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data_3.pred_txt = "initialization: stat_loc_init_on_success:\n \\result >= 0 && \\old(stat_loc) != \\null ==> \\initialized(\\old(stat_loc))"; __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data_3.fct = "waitpid"; - __gen_e_acsl_assert_data_3.line = 86; + __gen_e_acsl_assert_data_3.line = 89; __e_acsl_assert(__gen_e_acsl_implies,& __gen_e_acsl_assert_data_3); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); __e_acsl_contract_clean(__gen_e_acsl_contract); diff --git a/src/plugins/e-acsl/tests/builtin/oracle/strcat.res.oracle b/src/plugins/e-acsl/tests/builtin/oracle/strcat.res.oracle index 19dbb447c775cdf3cef0296249455486845756dc..c63be9146f50355689141c67e84aa8a5bd3673b7 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/strcat.res.oracle +++ b/src/plugins/e-acsl/tests/builtin/oracle/strcat.res.oracle @@ -11,10 +11,10 @@ [e-acsl] FRAMAC_SHARE/libc/unistd.h:843: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. -[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:79: Warning: +[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:82: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. -[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:86: Warning: +[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:89: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. [e-acsl] FRAMAC_SHARE/libc/stdlib.h:470: Warning: diff --git a/src/plugins/e-acsl/tests/builtin/oracle/strcmp.res.oracle b/src/plugins/e-acsl/tests/builtin/oracle/strcmp.res.oracle index a8284618e550daae25f90434b93e89e3e99786e9..c9c93a0901d6ad3ed35316884eb6cf6090c5896f 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/strcmp.res.oracle +++ b/src/plugins/e-acsl/tests/builtin/oracle/strcmp.res.oracle @@ -44,10 +44,10 @@ [e-acsl] FRAMAC_SHARE/libc/unistd.h:843: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. -[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:79: Warning: +[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:82: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. -[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:86: Warning: +[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:89: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. [e-acsl] FRAMAC_SHARE/libc/stdlib.h:470: Warning: diff --git a/src/plugins/e-acsl/tests/builtin/oracle/strcpy.res.oracle b/src/plugins/e-acsl/tests/builtin/oracle/strcpy.res.oracle index 247fe7037ee8d8b4c19af56b986307549d5473f8..930d48cf15e4b7bbcf80d4af2564e9c99fc34e86 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/strcpy.res.oracle +++ b/src/plugins/e-acsl/tests/builtin/oracle/strcpy.res.oracle @@ -39,10 +39,10 @@ [e-acsl] FRAMAC_SHARE/libc/unistd.h:843: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. -[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:79: Warning: +[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:82: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. -[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:86: Warning: +[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:89: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. [e-acsl] FRAMAC_SHARE/libc/stdlib.h:470: Warning: diff --git a/src/plugins/e-acsl/tests/builtin/oracle/strlen.res.oracle b/src/plugins/e-acsl/tests/builtin/oracle/strlen.res.oracle index 96325fbbbf3c10a63062b0076067e5fd1e6d8547..ace2bc58bc26deed40f0c82d6d2bf54e4365d4ea 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/strlen.res.oracle +++ b/src/plugins/e-acsl/tests/builtin/oracle/strlen.res.oracle @@ -42,10 +42,10 @@ [e-acsl] FRAMAC_SHARE/libc/unistd.h:843: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. -[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:79: Warning: +[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:82: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. -[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:86: Warning: +[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:89: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. [e-acsl] FRAMAC_SHARE/libc/stdlib.h:470: Warning: diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/gen_parallel_threads.c b/src/plugins/e-acsl/tests/concurrency/oracle/gen_parallel_threads.c new file mode 100644 index 0000000000000000000000000000000000000000..f9f9cc90b23dca264000398bf076e305fc938793 --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/oracle/gen_parallel_threads.c @@ -0,0 +1,1961 @@ +/* Generated by Frama-C */ +#include "errno.h" +#include "pthread.h" +#include "sched.h" +#include "signal.h" +#include "stddef.h" +#include "stdint.h" +#include "stdio.h" +#include "stdlib.h" +#include "time.h" +#include "unistd.h" +char *__gen_e_acsl_literal_string_2; +char *__gen_e_acsl_literal_string_5; +char *__gen_e_acsl_literal_string_3; +char *__gen_e_acsl_literal_string_6; +char *__gen_e_acsl_literal_string_11; +char *__gen_e_acsl_literal_string_12; +char *__gen_e_acsl_literal_string; +char *__gen_e_acsl_literal_string_4; +char *__gen_e_acsl_literal_string_7; +char *__gen_e_acsl_literal_string_8; +char *__gen_e_acsl_literal_string_9; +char *__gen_e_acsl_literal_string_10; +char *__gen_e_acsl_literal_string_13; +char *__gen_e_acsl_literal_string_14; +extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; + +/*@ requires valid_cond: \valid(cond); + ensures sucess: \result == 0; + assigns \result; + assigns \result \from \nothing; + */ +int __gen_e_acsl_pthread_cond_broadcast(pthread_cond_t *cond); + +/*@ requires valid_cond: \valid(cond); + requires valid_null_attr: attr == \null || \valid_read(attr); + ensures initialization: cond: \initialized(\old(cond)); + ensures success: \result == 0; + assigns *cond, \result; + assigns *cond \from *attr; + assigns \result \from \nothing; + */ +int __gen_e_acsl_pthread_cond_init(pthread_cond_t * restrict cond, + pthread_condattr_t const * restrict attr); + +/*@ requires valid_cond: \valid(cond); + requires valid_mutex: \valid(mutex); + ensures success: \result == 0; + assigns \result; + assigns \result \from \nothing; + */ +int __gen_e_acsl_pthread_cond_wait(pthread_cond_t * restrict cond, + pthread_mutex_t * restrict mutex); + +/*@ requires valid_thread: \valid(thread); + requires valid_null_attr: attr == \null || \valid_read(attr); + requires valid_routine: \valid_function(start_routine); + requires valid_null_arg: arg == \null || \valid((char *)arg); + ensures + success_or_error: + \result == 0 || \result == 11 || \result == 22 || \result == 1; + assigns *thread, \result; + assigns *thread \from *attr; + assigns \result \from (indirect: *attr); + */ +int __gen_e_acsl_pthread_create(pthread_t * restrict thread, + pthread_attr_t const * restrict attr, + void *(*start_routine)(void *), + void * restrict arg); + +/*@ requires valid_or_null_retval: retval == \null || \valid(retval); + ensures + success_or_error: + \result == 0 || \result == 35 || \result == 22 || \result == 3; + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + + behavior ignore_retval: + assumes null_retval: retval == \null; + assigns \result; + assigns \result \from (indirect: thread); + + behavior use_retval: + assumes valid_retval: \valid(retval); + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + */ +int __gen_e_acsl_pthread_join(pthread_t thread, void **retval); + +/*@ requires mutex_valid: \valid(mutex); + requires attrs_valid_or_null: attrs == \null || \valid_read(attrs); + ensures + initialization: success_or_error: + (\result == 0 && \initialized(\old(mutex))) || \result == 11 || + \result == 12 || \result == 1 || \result == 22; + assigns *mutex, \result; + assigns *mutex \from *mutex, *attrs; + assigns \result \from (indirect: *mutex), (indirect: *attrs); + */ +int __gen_e_acsl_pthread_mutex_init(pthread_mutex_t * restrict mutex, + pthread_mutexattr_t const * restrict attrs); + +/*@ requires mutex_valid: \valid(mutex); + ensures + success_or_error: + \result == 0 || \result == 11 || \result == 22 || \result == 35; + assigns *mutex, \result; + assigns *mutex \from *mutex; + assigns \result \from (indirect: *mutex); + */ +int __gen_e_acsl_pthread_mutex_lock(pthread_mutex_t *mutex); + +/*@ requires mutex_valid: \valid(mutex); + ensures success_or_error: \result == 0 || \result == 1; + assigns *mutex, \result; + assigns *mutex \from *mutex; + assigns \result \from (indirect: *mutex); + */ +int __gen_e_acsl_pthread_mutex_unlock(pthread_mutex_t *mutex); + +/*@ requires valid_string_s: valid_read_string(s); + assigns __fc_stdout; + assigns __fc_stdout \from __fc_errno, *(s + (0 .. strlen{Old}(s))); + */ +void __gen_e_acsl_perror(char const *s); + +/*@ exits status: \exit_status == \old(status); + ensures never_terminates: \false; + + assigns \exit_status \from status; + */ +void __gen_e_acsl_exit(int status); + +/*@ ensures result_ok_or_error: \result == 0 || \result == -1; + assigns \result, Frama_C_entropy_source; + assigns \result + \from (indirect: usec), (indirect: Frama_C_entropy_source); + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +int __gen_e_acsl_usleep(useconds_t usec); + +int *values[10]; +int write_count = 0; +int read_count = 0; +pthread_cond_t write_cond; +pthread_cond_t read_cond; +pthread_mutex_t write_mutex; +pthread_mutex_t read_mutex; +/*@ ensures + \let idx = *((int *)\old(arg)); + \valid(values[idx]) && \initialized(values[idx]); + */ +void *__gen_e_acsl_write_value(void *arg); + +void *write_value(void *arg) +{ + void *__retres; + int tmp; + int tmp_0; + int tmp_1; + __e_acsl_store_block((void *)(& tmp_1),(size_t)4); + __e_acsl_store_block((void *)(& tmp_0),(size_t)4); + __e_acsl_store_block((void *)(& tmp),(size_t)4); + __e_acsl_store_block((void *)(& __retres),(size_t)8); + __e_acsl_store_block((void *)(& arg),(size_t)8); + __e_acsl_full_init((void *)(& tmp)); + tmp = __gen_e_acsl_pthread_mutex_lock(& write_mutex); + if (tmp != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string); + __gen_e_acsl_exit(1); + } + write_count ++; + __e_acsl_full_init((void *)(& tmp_0)); + tmp_0 = __gen_e_acsl_pthread_cond_wait(& write_cond,& write_mutex); + if (tmp_0 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_2); + __gen_e_acsl_exit(1); + } + __e_acsl_full_init((void *)(& tmp_1)); + tmp_1 = __gen_e_acsl_pthread_mutex_unlock(& write_mutex); + if (tmp_1 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_3); + __gen_e_acsl_exit(1); + } + __gen_e_acsl_usleep((unsigned int)100); + int idx = *((int *)arg); + __e_acsl_store_block((void *)(& idx),(size_t)4); + __e_acsl_full_init((void *)(& idx)); + __e_acsl_initialize((void *)(& values[idx]),sizeof(int *)); + values[idx] = (int *)malloc(sizeof(int)); + __e_acsl_initialize((void *)values[idx],sizeof(int)); + *(values[idx]) = idx; + __e_acsl_full_init((void *)(& __retres)); + __retres = (void *)0; + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& idx)); + __e_acsl_delete_block((void *)(& tmp_1)); + __e_acsl_delete_block((void *)(& tmp_0)); + __e_acsl_delete_block((void *)(& tmp)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; +} + +/*@ requires + !(\let idx = *((int *)arg); + \valid_read(values[idx]) && \initialized(values[idx])); + */ +void *__gen_e_acsl_read_value(void *arg); + +void *read_value(void *arg) +{ + void *__retres; + int tmp; + int tmp_0; + int tmp_1; + __e_acsl_store_block((void *)(& tmp_1),(size_t)4); + __e_acsl_store_block((void *)(& tmp_0),(size_t)4); + __e_acsl_store_block((void *)(& tmp),(size_t)4); + __e_acsl_store_block((void *)(& __retres),(size_t)8); + __e_acsl_store_block((void *)(& arg),(size_t)8); + __e_acsl_full_init((void *)(& tmp)); + tmp = __gen_e_acsl_pthread_mutex_lock(& read_mutex); + if (tmp != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_4); + __gen_e_acsl_exit(1); + } + read_count ++; + __e_acsl_full_init((void *)(& tmp_0)); + tmp_0 = __gen_e_acsl_pthread_cond_wait(& read_cond,& read_mutex); + if (tmp_0 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_5); + __gen_e_acsl_exit(1); + } + __e_acsl_full_init((void *)(& tmp_1)); + tmp_1 = __gen_e_acsl_pthread_mutex_unlock(& read_mutex); + if (tmp_1 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_6); + __gen_e_acsl_exit(1); + } + __gen_e_acsl_usleep((unsigned int)100); + { + int __gen_e_acsl_idx; + int __gen_e_acsl_initialized; + int __gen_e_acsl_and; + int __gen_e_acsl_and_2; + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"*((int *)arg)", + 0,*((int *)arg)); + __gen_e_acsl_idx = *((int *)arg); + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"&values[idx]", + (void *)(& values[__gen_e_acsl_idx])); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int *)",0,sizeof(int *)); + __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& values[__gen_e_acsl_idx]), + sizeof(int *)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\initialized(&values[idx])",0, + __gen_e_acsl_initialized); + if (__gen_e_acsl_initialized) { + int __gen_e_acsl_valid_read; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]", + (void *)values[__gen_e_acsl_idx]); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "RTE"; + __gen_e_acsl_assert_data_2.pred_txt = "index_bound: __gen_e_acsl_idx < 10"; + __gen_e_acsl_assert_data_2.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_2.fct = "read_value"; + __gen_e_acsl_assert_data_2.line = 82; + __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "RTE"; + __gen_e_acsl_assert_data_3.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx"; + __gen_e_acsl_assert_data_3.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_3.fct = "read_value"; + __gen_e_acsl_assert_data_3.line = 82; + __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)values[__gen_e_acsl_idx], + sizeof(int), + (void *)values[__gen_e_acsl_idx], + (void *)(& values[__gen_e_acsl_idx])); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid_read(values[idx])",0, + __gen_e_acsl_valid_read); + __gen_e_acsl_and = __gen_e_acsl_valid_read; + } + else __gen_e_acsl_and = 0; + if (__gen_e_acsl_and) { + int __gen_e_acsl_initialized_2; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]", + (void *)values[__gen_e_acsl_idx]); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "RTE"; + __gen_e_acsl_assert_data_4.pred_txt = "index_bound: __gen_e_acsl_idx < 10"; + __gen_e_acsl_assert_data_4.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_4.fct = "read_value"; + __gen_e_acsl_assert_data_4.line = 82; + __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_5.blocking = 1; + __gen_e_acsl_assert_data_5.kind = "RTE"; + __gen_e_acsl_assert_data_5.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx"; + __gen_e_acsl_assert_data_5.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_5.fct = "read_value"; + __gen_e_acsl_assert_data_5.line = 82; + __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_5); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)values[__gen_e_acsl_idx], + sizeof(int)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\initialized(values[idx])",0, + __gen_e_acsl_initialized_2); + __gen_e_acsl_and_2 = __gen_e_acsl_initialized_2; + } + else __gen_e_acsl_and_2 = 0; + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "\\let idx = *((int *)arg);\n \\valid_read(values[idx]) && \\initialized(values[idx])"; + __gen_e_acsl_assert_data.file = "parallel_threads.c"; + __gen_e_acsl_assert_data.fct = "read_value"; + __gen_e_acsl_assert_data.line = 81; + __e_acsl_assert(__gen_e_acsl_and_2,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + } + /*@ requires + \let idx = *((int *)arg); + \valid_read(values[idx]) && \initialized(values[idx]); + */ + { + int idx = *((int *)arg); + __e_acsl_store_block((void *)(& idx),(size_t)4); + __e_acsl_full_init((void *)(& idx)); + { + int __gen_e_acsl_initialized_3; + int __gen_e_acsl_and_3; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_6 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_6, + "*(values[idx])",0,*(values[idx])); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_6,"idx",0,idx); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_7 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_7, + "&values[idx]",(void *)(& values[idx])); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_7, + "sizeof(int *)",0,sizeof(int *)); + __gen_e_acsl_initialized_3 = __e_acsl_initialized((void *)(& values[idx]), + sizeof(int *)); + if (__gen_e_acsl_initialized_3) { + int __gen_e_acsl_valid_read_2; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_7, + "values[idx]",(void *)values[idx]); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_8 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_8,"idx",0, + idx); + __gen_e_acsl_assert_data_8.blocking = 1; + __gen_e_acsl_assert_data_8.kind = "RTE"; + __gen_e_acsl_assert_data_8.pred_txt = "index_bound: idx < 10"; + __gen_e_acsl_assert_data_8.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_8.fct = "read_value"; + __gen_e_acsl_assert_data_8.line = 85; + __e_acsl_assert(idx < 10,& __gen_e_acsl_assert_data_8); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_9 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_9,"idx",0, + idx); + __gen_e_acsl_assert_data_9.blocking = 1; + __gen_e_acsl_assert_data_9.kind = "RTE"; + __gen_e_acsl_assert_data_9.pred_txt = "index_bound: 0 <= idx"; + __gen_e_acsl_assert_data_9.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_9.fct = "read_value"; + __gen_e_acsl_assert_data_9.line = 85; + __e_acsl_assert(0 <= idx,& __gen_e_acsl_assert_data_9); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_9); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_7, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)values[idx], + sizeof(int), + (void *)values[idx], + (void *)(& values[idx])); + __gen_e_acsl_and_3 = __gen_e_acsl_valid_read_2; + } + else __gen_e_acsl_and_3 = 0; + __gen_e_acsl_assert_data_7.blocking = 1; + __gen_e_acsl_assert_data_7.kind = "RTE"; + __gen_e_acsl_assert_data_7.pred_txt = "mem_access: \\valid_read(values[idx])"; + __gen_e_acsl_assert_data_7.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_7.fct = "read_value"; + __gen_e_acsl_assert_data_7.line = 85; + __e_acsl_assert(__gen_e_acsl_and_3,& __gen_e_acsl_assert_data_7); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_7); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_10 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_10,"idx",0,idx); + __gen_e_acsl_assert_data_10.blocking = 1; + __gen_e_acsl_assert_data_10.kind = "RTE"; + __gen_e_acsl_assert_data_10.pred_txt = "index_bound: idx < 10"; + __gen_e_acsl_assert_data_10.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_10.fct = "read_value"; + __gen_e_acsl_assert_data_10.line = 85; + __e_acsl_assert(idx < 10,& __gen_e_acsl_assert_data_10); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_10); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_11 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_11,"idx",0,idx); + __gen_e_acsl_assert_data_11.blocking = 1; + __gen_e_acsl_assert_data_11.kind = "RTE"; + __gen_e_acsl_assert_data_11.pred_txt = "index_bound: 0 <= idx"; + __gen_e_acsl_assert_data_11.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_11.fct = "read_value"; + __gen_e_acsl_assert_data_11.line = 85; + __e_acsl_assert(0 <= idx,& __gen_e_acsl_assert_data_11); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_11); + __gen_e_acsl_assert_data_6.blocking = 1; + __gen_e_acsl_assert_data_6.kind = "Assertion"; + __gen_e_acsl_assert_data_6.pred_txt = "*(values[idx]) == idx"; + __gen_e_acsl_assert_data_6.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_6.fct = "read_value"; + __gen_e_acsl_assert_data_6.line = 85; + __e_acsl_assert(*(values[idx]) == idx,& __gen_e_acsl_assert_data_6); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_6); + } + /*@ assert *(values[idx]) == idx; */ ; + free((void *)values[idx]); + __e_acsl_full_init((void *)(& __retres)); + __retres = (void *)0; + __e_acsl_delete_block((void *)(& idx)); + goto return_label; + __e_acsl_delete_block((void *)(& idx)); + } + return_label: + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& tmp_1)); + __e_acsl_delete_block((void *)(& tmp_0)); + __e_acsl_delete_block((void *)(& tmp)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; +} + +/*@ requires + !(\let idx = *((int *)arg); + \valid_read(values[idx]) && \initialized(values[idx])); + */ +void *__gen_e_acsl_read_value(void *arg) +{ + void *__retres; + __e_acsl_store_block((void *)(& __retres),(size_t)8); + { + int __gen_e_acsl_idx; + int __gen_e_acsl_initialized; + int __gen_e_acsl_and; + int __gen_e_acsl_and_2; + __e_acsl_store_block((void *)(& arg),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"*((int *)arg)", + 0,*((int *)arg)); + __gen_e_acsl_idx = *((int *)arg); + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"&values[idx]", + (void *)(& values[__gen_e_acsl_idx])); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int *)",0,sizeof(int *)); + __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& values[__gen_e_acsl_idx]), + sizeof(int *)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\initialized(&values[idx])",0, + __gen_e_acsl_initialized); + if (__gen_e_acsl_initialized) { + int __gen_e_acsl_valid_read; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]", + (void *)values[__gen_e_acsl_idx]); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "RTE"; + __gen_e_acsl_assert_data_2.pred_txt = "index_bound: __gen_e_acsl_idx < 10"; + __gen_e_acsl_assert_data_2.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_2.fct = "read_value"; + __gen_e_acsl_assert_data_2.line = 61; + __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "RTE"; + __gen_e_acsl_assert_data_3.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx"; + __gen_e_acsl_assert_data_3.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_3.fct = "read_value"; + __gen_e_acsl_assert_data_3.line = 61; + __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)values[__gen_e_acsl_idx], + sizeof(int), + (void *)values[__gen_e_acsl_idx], + (void *)(& values[__gen_e_acsl_idx])); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid_read(values[idx])",0, + __gen_e_acsl_valid_read); + __gen_e_acsl_and = __gen_e_acsl_valid_read; + } + else __gen_e_acsl_and = 0; + if (__gen_e_acsl_and) { + int __gen_e_acsl_initialized_2; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]", + (void *)values[__gen_e_acsl_idx]); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "RTE"; + __gen_e_acsl_assert_data_4.pred_txt = "index_bound: __gen_e_acsl_idx < 10"; + __gen_e_acsl_assert_data_4.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_4.fct = "read_value"; + __gen_e_acsl_assert_data_4.line = 61; + __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_5.blocking = 1; + __gen_e_acsl_assert_data_5.kind = "RTE"; + __gen_e_acsl_assert_data_5.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx"; + __gen_e_acsl_assert_data_5.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_5.fct = "read_value"; + __gen_e_acsl_assert_data_5.line = 61; + __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_5); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)values[__gen_e_acsl_idx], + sizeof(int)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\initialized(values[idx])",0, + __gen_e_acsl_initialized_2); + __gen_e_acsl_and_2 = __gen_e_acsl_initialized_2; + } + else __gen_e_acsl_and_2 = 0; + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "!(\\let idx = *((int *)arg);\n \\valid_read(values[idx]) && \\initialized(values[idx]))"; + __gen_e_acsl_assert_data.file = "parallel_threads.c"; + __gen_e_acsl_assert_data.fct = "read_value"; + __gen_e_acsl_assert_data.line = 60; + __e_acsl_assert(! __gen_e_acsl_and_2,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + } + __retres = read_value(arg); + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; +} + +/*@ ensures + \let idx = *((int *)\old(arg)); + \valid(values[idx]) && \initialized(values[idx]); + */ +void *__gen_e_acsl_write_value(void *arg) +{ + void *__gen_e_acsl_at; + void *__retres; + __e_acsl_store_block((void *)(& __retres),(size_t)8); + __e_acsl_store_block((void *)(& arg),(size_t)8); + __gen_e_acsl_at = arg; + __retres = write_value(arg); + { + int __gen_e_acsl_idx; + int __gen_e_acsl_initialized; + int __gen_e_acsl_and; + int __gen_e_acsl_and_2; + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "*((int *)\\old(arg))",0, + *((int *)__gen_e_acsl_at)); + __gen_e_acsl_idx = *((int *)__gen_e_acsl_at); + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"&values[idx]", + (void *)(& values[__gen_e_acsl_idx])); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int *)",0,sizeof(int *)); + __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& values[__gen_e_acsl_idx]), + sizeof(int *)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\initialized(&values[idx])",0, + __gen_e_acsl_initialized); + if (__gen_e_acsl_initialized) { + int __gen_e_acsl_valid; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]", + (void *)values[__gen_e_acsl_idx]); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "RTE"; + __gen_e_acsl_assert_data_2.pred_txt = "index_bound: __gen_e_acsl_idx < 10"; + __gen_e_acsl_assert_data_2.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_2.fct = "write_value"; + __gen_e_acsl_assert_data_2.line = 32; + __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "RTE"; + __gen_e_acsl_assert_data_3.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx"; + __gen_e_acsl_assert_data_3.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_3.fct = "write_value"; + __gen_e_acsl_assert_data_3.line = 32; + __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_valid = __e_acsl_valid((void *)values[__gen_e_acsl_idx], + sizeof(int), + (void *)values[__gen_e_acsl_idx], + (void *)(& values[__gen_e_acsl_idx])); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid(values[idx])",0, + __gen_e_acsl_valid); + __gen_e_acsl_and = __gen_e_acsl_valid; + } + else __gen_e_acsl_and = 0; + if (__gen_e_acsl_and) { + int __gen_e_acsl_initialized_2; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]", + (void *)values[__gen_e_acsl_idx]); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "RTE"; + __gen_e_acsl_assert_data_4.pred_txt = "index_bound: __gen_e_acsl_idx < 10"; + __gen_e_acsl_assert_data_4.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_4.fct = "write_value"; + __gen_e_acsl_assert_data_4.line = 32; + __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_5.blocking = 1; + __gen_e_acsl_assert_data_5.kind = "RTE"; + __gen_e_acsl_assert_data_5.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx"; + __gen_e_acsl_assert_data_5.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_5.fct = "write_value"; + __gen_e_acsl_assert_data_5.line = 32; + __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_5); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)values[__gen_e_acsl_idx], + sizeof(int)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\initialized(values[idx])",0, + __gen_e_acsl_initialized_2); + __gen_e_acsl_and_2 = __gen_e_acsl_initialized_2; + } + else __gen_e_acsl_and_2 = 0; + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Postcondition"; + __gen_e_acsl_assert_data.pred_txt = "\\let idx = *((int *)\\old(arg));\n \\valid(values[idx]) && \\initialized(values[idx])"; + __gen_e_acsl_assert_data.file = "parallel_threads.c"; + __gen_e_acsl_assert_data.fct = "write_value"; + __gen_e_acsl_assert_data.line = 31; + __e_acsl_assert(__gen_e_acsl_and_2,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ ensures result_ok_or_error: \result == 0 || \result == -1; + assigns \result, Frama_C_entropy_source; + assigns \result + \from (indirect: usec), (indirect: Frama_C_entropy_source); + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +int __gen_e_acsl_usleep(useconds_t usec) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + __e_acsl_store_block((void *)(& usec),(size_t)4); + __retres = usleep(usec); + { + int __gen_e_acsl_or; + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\result",0, + __retres); + __gen_e_acsl_or = __retres == -1; + } + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Postcondition"; + __gen_e_acsl_assert_data.pred_txt = "result_ok_or_error: \\result == 0 || \\result == -1"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/unistd.h"; + __gen_e_acsl_assert_data.fct = "usleep"; + __gen_e_acsl_assert_data.line = 1119; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_delete_block((void *)(& usec)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ exits status: \exit_status == \old(status); + ensures never_terminates: \false; + + assigns \exit_status \from status; + */ +void __gen_e_acsl_exit(int status) +{ + __e_acsl_store_block((void *)(& status),(size_t)4); + exit(status); + { + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Postcondition"; + __gen_e_acsl_assert_data.pred_txt = "never_terminates: \\false"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/stdlib.h"; + __gen_e_acsl_assert_data.fct = "exit"; + __gen_e_acsl_assert_data.line = 473; + __e_acsl_assert(0,& __gen_e_acsl_assert_data); + __e_acsl_delete_block((void *)(& status)); + return; + } +} + +/*@ requires valid_string_s: valid_read_string(s); + assigns __fc_stdout; + assigns __fc_stdout \from __fc_errno, *(s + (0 .. strlen{Old}(s))); + */ +void __gen_e_acsl_perror(char const *s) +{ + __e_acsl_store_block((void *)(& s),(size_t)8); + perror(s); + __e_acsl_delete_block((void *)(& s)); + return; +} + +/*@ requires mutex_valid: \valid(mutex); + ensures success_or_error: \result == 0 || \result == 1; + assigns *mutex, \result; + assigns *mutex \from *mutex; + assigns \result \from (indirect: *mutex); + */ +int __gen_e_acsl_pthread_mutex_unlock(pthread_mutex_t *mutex) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + __e_acsl_store_block((void *)(& mutex),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"mutex", + (void *)mutex); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_mutex_t)",0, + sizeof(pthread_mutex_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)mutex, + sizeof(pthread_mutex_t), + (void *)mutex,(void *)(& mutex)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(mutex)", + 0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "mutex_valid: \\valid(mutex)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_mutex_unlock"; + __gen_e_acsl_assert_data.line = 313; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + } + __retres = pthread_mutex_unlock(mutex); + { + int __gen_e_acsl_or; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or = __retres == 1; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Postcondition"; + __gen_e_acsl_assert_data_2.pred_txt = "success_or_error: \\result == 0 || \\result == 1"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_mutex_unlock"; + __gen_e_acsl_assert_data_2.line = 316; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_delete_block((void *)(& mutex)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires mutex_valid: \valid(mutex); + ensures + success_or_error: + \result == 0 || \result == 11 || \result == 22 || \result == 35; + assigns *mutex, \result; + assigns *mutex \from *mutex; + assigns \result \from (indirect: *mutex); + */ +int __gen_e_acsl_pthread_mutex_lock(pthread_mutex_t *mutex) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + __e_acsl_store_block((void *)(& mutex),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"mutex", + (void *)mutex); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_mutex_t)",0, + sizeof(pthread_mutex_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)mutex, + sizeof(pthread_mutex_t), + (void *)mutex,(void *)(& mutex)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(mutex)", + 0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "mutex_valid: \\valid(mutex)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_mutex_lock"; + __gen_e_acsl_assert_data.line = 295; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + } + __retres = pthread_mutex_lock(mutex); + { + int __gen_e_acsl_or; + int __gen_e_acsl_or_2; + int __gen_e_acsl_or_3; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or = __retres == 11; + } + if (__gen_e_acsl_or) __gen_e_acsl_or_2 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_2 = __retres == 22; + } + if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_3 = __retres == 35; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Postcondition"; + __gen_e_acsl_assert_data_2.pred_txt = "success_or_error:\n \\result == 0 || \\result == 11 || \\result == 22 || \\result == 35"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_mutex_lock"; + __gen_e_acsl_assert_data_2.line = 299; + __e_acsl_assert(__gen_e_acsl_or_3,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_delete_block((void *)(& mutex)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires mutex_valid: \valid(mutex); + requires attrs_valid_or_null: attrs == \null || \valid_read(attrs); + ensures + initialization: success_or_error: + (\result == 0 && \initialized(\old(mutex))) || \result == 11 || + \result == 12 || \result == 1 || \result == 22; + assigns *mutex, \result; + assigns *mutex \from *mutex, *attrs; + assigns \result \from (indirect: *mutex), (indirect: *attrs); + */ +int __gen_e_acsl_pthread_mutex_init(pthread_mutex_t * restrict mutex, + pthread_mutexattr_t const * restrict attrs) +{ + pthread_mutex_t *__gen_e_acsl_at; + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + int __gen_e_acsl_or; + __e_acsl_store_block((void *)(& attrs),(size_t)8); + __e_acsl_store_block((void *)(& mutex),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"mutex", + (void *)mutex); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_mutex_t)",0, + sizeof(pthread_mutex_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)mutex, + sizeof(pthread_mutex_t), + (void *)mutex,(void *)(& mutex)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(mutex)", + 0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "mutex_valid: \\valid(mutex)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_mutex_init"; + __gen_e_acsl_assert_data.line = 279; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attrs", + (void *)attrs); + if (attrs == (pthread_mutexattr_t const *)0) __gen_e_acsl_or = 1; + else { + int __gen_e_acsl_valid_read; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attrs", + (void *)attrs); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(pthread_mutexattr_t const)",0, + sizeof(pthread_mutexattr_t const)); + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attrs, + sizeof(pthread_mutexattr_t const), + (void *)attrs, + (void *)(& attrs)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "\\valid_read(attrs)",0, + __gen_e_acsl_valid_read); + __gen_e_acsl_or = __gen_e_acsl_valid_read; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Precondition"; + __gen_e_acsl_assert_data_2.pred_txt = "attrs_valid_or_null: attrs == \\null || \\valid_read(attrs)"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_mutex_init"; + __gen_e_acsl_assert_data_2.line = 280; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + } + __gen_e_acsl_at = mutex; + __retres = pthread_mutex_init(mutex,attrs); + { + int __gen_e_acsl_and; + int __gen_e_acsl_or_2; + int __gen_e_acsl_or_3; + int __gen_e_acsl_or_4; + int __gen_e_acsl_or_5; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0, + __retres); + if (__retres == 0) { + int __gen_e_acsl_initialized; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_3, + "\\old(mutex)",(void *)__gen_e_acsl_at); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_3, + "sizeof(pthread_mutex_t)",0, + sizeof(pthread_mutex_t)); + __gen_e_acsl_initialized = __e_acsl_initialized((void *)__gen_e_acsl_at, + sizeof(pthread_mutex_t)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3, + "\\initialized(\\old(mutex))",0, + __gen_e_acsl_initialized); + __gen_e_acsl_and = __gen_e_acsl_initialized; + } + else __gen_e_acsl_and = 0; + if (__gen_e_acsl_and) __gen_e_acsl_or_2 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0, + __retres); + __gen_e_acsl_or_2 = __retres == 11; + } + if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0, + __retres); + __gen_e_acsl_or_3 = __retres == 12; + } + if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0, + __retres); + __gen_e_acsl_or_4 = __retres == 1; + } + if (__gen_e_acsl_or_4) __gen_e_acsl_or_5 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0, + __retres); + __gen_e_acsl_or_5 = __retres == 22; + } + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "Postcondition"; + __gen_e_acsl_assert_data_3.pred_txt = "initialization: success_or_error:\n (\\result == 0 && \\initialized(\\old(mutex))) || \\result == 11 ||\n \\result == 12 || \\result == 1 || \\result == 22"; + __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_3.fct = "pthread_mutex_init"; + __gen_e_acsl_assert_data_3.line = 285; + __e_acsl_assert(__gen_e_acsl_or_5,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + __e_acsl_delete_block((void *)(& attrs)); + __e_acsl_delete_block((void *)(& mutex)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires valid_or_null_retval: retval == \null || \valid(retval); + ensures + success_or_error: + \result == 0 || \result == 35 || \result == 22 || \result == 3; + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + + behavior ignore_retval: + assumes null_retval: retval == \null; + assigns \result; + assigns \result \from (indirect: thread); + + behavior use_retval: + assumes valid_retval: \valid(retval); + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + */ +int __gen_e_acsl_pthread_join(pthread_t thread, void **retval) +{ + __e_acsl_contract_t *__gen_e_acsl_contract; + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_or; + int __gen_e_acsl_valid_2; + __e_acsl_store_block((void *)(& retval),(size_t)8); + __e_acsl_store_block((void *)(& thread),(size_t)4); + __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval", + (void *)retval); + if (retval == (void **)0) __gen_e_acsl_or = 1; + else { + int __gen_e_acsl_valid; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval", + (void *)retval); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(void *)",0,sizeof(void *)); + __gen_e_acsl_valid = __e_acsl_valid((void *)retval,sizeof(void *), + (void *)retval,(void *)(& retval)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid(retval)",0,__gen_e_acsl_valid); + __gen_e_acsl_or = __gen_e_acsl_valid; + } + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_or_null_retval: retval == \\null || \\valid(retval)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_join"; + __gen_e_acsl_assert_data.line = 247; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0, + retval == (void **)0); + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)retval,sizeof(void *), + (void *)retval,(void *)(& retval)); + __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1, + __gen_e_acsl_valid_2); + } + __retres = pthread_join(thread,retval); + { + int __gen_e_acsl_or_2; + int __gen_e_acsl_or_3; + int __gen_e_acsl_or_4; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or_2 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_2 = __retres == 35; + } + if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_3 = __retres == 22; + } + if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_4 = __retres == 3; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Postcondition"; + __gen_e_acsl_assert_data_2.pred_txt = "success_or_error:\n \\result == 0 || \\result == 35 || \\result == 22 || \\result == 3"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_join"; + __gen_e_acsl_assert_data_2.line = 251; + __e_acsl_assert(__gen_e_acsl_or_4,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_contract_clean(__gen_e_acsl_contract); + __e_acsl_delete_block((void *)(& retval)); + __e_acsl_delete_block((void *)(& thread)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires valid_thread: \valid(thread); + requires valid_null_attr: attr == \null || \valid_read(attr); + requires valid_routine: \valid_function(start_routine); + requires valid_null_arg: arg == \null || \valid((char *)arg); + ensures + success_or_error: + \result == 0 || \result == 11 || \result == 22 || \result == 1; + assigns *thread, \result; + assigns *thread \from *attr; + assigns \result \from (indirect: *attr); + */ +int __gen_e_acsl_pthread_create(pthread_t * restrict thread, + pthread_attr_t const * restrict attr, + void *(*start_routine)(void *), + void * restrict arg) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + int __gen_e_acsl_or; + int __gen_e_acsl_or_2; + __e_acsl_store_block((void *)(& arg),(size_t)8); + __e_acsl_store_block((void *)(& start_routine),(size_t)8); + __e_acsl_store_block((void *)(& attr),(size_t)8); + __e_acsl_store_block((void *)(& thread),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"thread", + (void *)thread); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_t)",0,sizeof(pthread_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)thread,sizeof(pthread_t), + (void *)thread,(void *)(& thread)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid(thread)",0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_thread: \\valid(thread)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_create"; + __gen_e_acsl_assert_data.line = 223; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr", + (void *)attr); + if (attr == (pthread_attr_t const *)0) __gen_e_acsl_or = 1; + else { + int __gen_e_acsl_valid_read; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr", + (void *)attr); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(pthread_attr_t const)",0, + sizeof(pthread_attr_t const)); + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attr, + sizeof(pthread_attr_t const), + (void *)attr, + (void *)(& attr)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "\\valid_read(attr)",0, + __gen_e_acsl_valid_read); + __gen_e_acsl_or = __gen_e_acsl_valid_read; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Precondition"; + __gen_e_acsl_assert_data_2.pred_txt = "valid_null_attr: attr == \\null || \\valid_read(attr)"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_create"; + __gen_e_acsl_assert_data_2.line = 224; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg); + if (arg == (void *)0) __gen_e_acsl_or_2 = 1; + else { + int __gen_e_acsl_valid_2; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4, + "sizeof(char)",0,sizeof(char)); + __gen_e_acsl_valid_2 = __e_acsl_valid(arg,sizeof(char),arg, + (void *)(& arg)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, + "\\valid((char *)arg)",0, + __gen_e_acsl_valid_2); + __gen_e_acsl_or_2 = __gen_e_acsl_valid_2; + } + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "Precondition"; + __gen_e_acsl_assert_data_4.pred_txt = "valid_null_arg: arg == \\null || \\valid((char *)arg)"; + __gen_e_acsl_assert_data_4.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_4.fct = "pthread_create"; + __gen_e_acsl_assert_data_4.line = 226; + __e_acsl_assert(__gen_e_acsl_or_2,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + } + __retres = __e_acsl_pthread_create(thread,attr,start_routine,arg); + { + int __gen_e_acsl_or_3; + int __gen_e_acsl_or_4; + int __gen_e_acsl_or_5; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or_3 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + __gen_e_acsl_or_3 = __retres == 11; + } + if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + __gen_e_acsl_or_4 = __retres == 22; + } + if (__gen_e_acsl_or_4) __gen_e_acsl_or_5 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + __gen_e_acsl_or_5 = __retres == 1; + } + __gen_e_acsl_assert_data_5.blocking = 1; + __gen_e_acsl_assert_data_5.kind = "Postcondition"; + __gen_e_acsl_assert_data_5.pred_txt = "success_or_error:\n \\result == 0 || \\result == 11 || \\result == 22 || \\result == 1"; + __gen_e_acsl_assert_data_5.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_5.fct = "pthread_create"; + __gen_e_acsl_assert_data_5.line = 230; + __e_acsl_assert(__gen_e_acsl_or_5,& __gen_e_acsl_assert_data_5); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5); + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& start_routine)); + __e_acsl_delete_block((void *)(& attr)); + __e_acsl_delete_block((void *)(& thread)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires valid_cond: \valid(cond); + requires valid_mutex: \valid(mutex); + ensures success: \result == 0; + assigns \result; + assigns \result \from \nothing; + */ +int __gen_e_acsl_pthread_cond_wait(pthread_cond_t * restrict cond, + pthread_mutex_t * restrict mutex) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + int __gen_e_acsl_valid_2; + __e_acsl_store_block((void *)(& mutex),(size_t)8); + __e_acsl_store_block((void *)(& cond),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"cond", + (void *)cond); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_cond_t)",0, + sizeof(pthread_cond_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)cond,sizeof(pthread_cond_t), + (void *)cond,(void *)(& cond)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(cond)", + 0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_cond: \\valid(cond)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_cond_wait"; + __gen_e_acsl_assert_data.line = 203; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"mutex", + (void *)mutex); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(pthread_mutex_t)",0, + sizeof(pthread_mutex_t)); + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)mutex, + sizeof(pthread_mutex_t), + (void *)mutex,(void *)(& mutex)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "\\valid(mutex)",0,__gen_e_acsl_valid_2); + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Precondition"; + __gen_e_acsl_assert_data_2.pred_txt = "valid_mutex: \\valid(mutex)"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_cond_wait"; + __gen_e_acsl_assert_data_2.line = 204; + __e_acsl_assert(__gen_e_acsl_valid_2,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + } + __retres = pthread_cond_wait(cond,mutex); + { + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0, + __retres); + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "Postcondition"; + __gen_e_acsl_assert_data_3.pred_txt = "success: \\result == 0"; + __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_3.fct = "pthread_cond_wait"; + __gen_e_acsl_assert_data_3.line = 206; + __e_acsl_assert(__retres == 0,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + __e_acsl_delete_block((void *)(& mutex)); + __e_acsl_delete_block((void *)(& cond)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires valid_cond: \valid(cond); + requires valid_null_attr: attr == \null || \valid_read(attr); + ensures initialization: cond: \initialized(\old(cond)); + ensures success: \result == 0; + assigns *cond, \result; + assigns *cond \from *attr; + assigns \result \from \nothing; + */ +int __gen_e_acsl_pthread_cond_init(pthread_cond_t * restrict cond, + pthread_condattr_t const * restrict attr) +{ + pthread_cond_t *__gen_e_acsl_at; + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + int __gen_e_acsl_or; + __e_acsl_store_block((void *)(& attr),(size_t)8); + __e_acsl_store_block((void *)(& cond),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"cond", + (void *)cond); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_cond_t)",0, + sizeof(pthread_cond_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)cond,sizeof(pthread_cond_t), + (void *)cond,(void *)(& cond)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(cond)", + 0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_cond: \\valid(cond)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_cond_init"; + __gen_e_acsl_assert_data.line = 187; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr", + (void *)attr); + if (attr == (pthread_condattr_t const *)0) __gen_e_acsl_or = 1; + else { + int __gen_e_acsl_valid_read; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr", + (void *)attr); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(pthread_condattr_t const)",0, + sizeof(pthread_condattr_t const)); + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attr, + sizeof(pthread_condattr_t const), + (void *)attr, + (void *)(& attr)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "\\valid_read(attr)",0, + __gen_e_acsl_valid_read); + __gen_e_acsl_or = __gen_e_acsl_valid_read; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Precondition"; + __gen_e_acsl_assert_data_2.pred_txt = "valid_null_attr: attr == \\null || \\valid_read(attr)"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_cond_init"; + __gen_e_acsl_assert_data_2.line = 188; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + } + __gen_e_acsl_at = cond; + __retres = pthread_cond_init(cond,attr); + { + int __gen_e_acsl_initialized; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_3,"\\old(cond)", + (void *)__gen_e_acsl_at); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_3, + "sizeof(pthread_cond_t)",0, + sizeof(pthread_cond_t)); + __gen_e_acsl_initialized = __e_acsl_initialized((void *)__gen_e_acsl_at, + sizeof(pthread_cond_t)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3, + "initialization: cond: \\initialized(\\old(cond))", + 0,__gen_e_acsl_initialized); + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "Postcondition"; + __gen_e_acsl_assert_data_3.pred_txt = "initialization: cond: \\initialized(\\old(cond))"; + __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_3.fct = "pthread_cond_init"; + __gen_e_acsl_assert_data_3.line = 191; + __e_acsl_assert(__gen_e_acsl_initialized,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,"\\result",0, + __retres); + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "Postcondition"; + __gen_e_acsl_assert_data_4.pred_txt = "success: \\result == 0"; + __gen_e_acsl_assert_data_4.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_4.fct = "pthread_cond_init"; + __gen_e_acsl_assert_data_4.line = 192; + __e_acsl_assert(__retres == 0,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + __e_acsl_delete_block((void *)(& attr)); + __e_acsl_delete_block((void *)(& cond)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires valid_cond: \valid(cond); + ensures sucess: \result == 0; + assigns \result; + assigns \result \from \nothing; + */ +int __gen_e_acsl_pthread_cond_broadcast(pthread_cond_t *cond) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + __e_acsl_store_block((void *)(& cond),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"cond", + (void *)cond); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_cond_t)",0, + sizeof(pthread_cond_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)cond,sizeof(pthread_cond_t), + (void *)cond,(void *)(& cond)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(cond)", + 0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_cond: \\valid(cond)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_cond_broadcast"; + __gen_e_acsl_assert_data.line = 173; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + } + __retres = pthread_cond_broadcast(cond); + { + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Postcondition"; + __gen_e_acsl_assert_data_2.pred_txt = "sucess: \\result == 0"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_cond_broadcast"; + __gen_e_acsl_assert_data_2.line = 175; + __e_acsl_assert(__retres == 0,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_delete_block((void *)(& cond)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +void __e_acsl_globals_init(void) +{ + static char __e_acsl_already_run = 0; + if (! __e_acsl_already_run) { + __e_acsl_already_run = 1; + __gen_e_acsl_literal_string_2 = "Unable to wait on condvar in write_value()"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_2, + sizeof("Unable to wait on condvar in write_value()")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_2); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_2); + __gen_e_acsl_literal_string_5 = "Unable to wait on condvar in read_value()"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_5, + sizeof("Unable to wait on condvar in read_value()")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_5); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_5); + __gen_e_acsl_literal_string_3 = "Unable to unlock mutex in write_value()"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_3, + sizeof("Unable to unlock mutex in write_value()")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_3); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_3); + __gen_e_acsl_literal_string_6 = "Unable to unlock mutex in read_value()"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_6, + sizeof("Unable to unlock mutex in read_value()")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_6); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_6); + __gen_e_acsl_literal_string_11 = "Unable to lock write_mutex"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_11, + sizeof("Unable to lock write_mutex")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_11); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_11); + __gen_e_acsl_literal_string_12 = "Unable to lock read_mutex"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_12, + sizeof("Unable to lock read_mutex")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_12); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_12); + __gen_e_acsl_literal_string = "Unable to lock mutex in write_value()"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string, + sizeof("Unable to lock mutex in write_value()")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string); + __gen_e_acsl_literal_string_4 = "Unable to lock mutex in read_value()"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_4, + sizeof("Unable to lock mutex in read_value()")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_4); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_4); + __gen_e_acsl_literal_string_7 = "Unable to initialize write mutex"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_7, + sizeof("Unable to initialize write mutex")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_7); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_7); + __gen_e_acsl_literal_string_8 = "Unable to initialize write cond var"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_8, + sizeof("Unable to initialize write cond var")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_8); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_8); + __gen_e_acsl_literal_string_9 = "Unable to initialize read mutex"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_9, + sizeof("Unable to initialize read mutex")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_9); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_9); + __gen_e_acsl_literal_string_10 = "Unable to initialize read cond var"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_10, + sizeof("Unable to initialize read cond var")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_10); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_10); + __gen_e_acsl_literal_string_13 = "Unable to broadcast to write cond var"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_13, + sizeof("Unable to broadcast to write cond var")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_13); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_13); + __gen_e_acsl_literal_string_14 = "Unable to broadcast to read cond var"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_14, + sizeof("Unable to broadcast to read cond var")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_14); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_14); + __e_acsl_store_block((void *)(& __gen_e_acsl_read_value),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_read_value)); + __e_acsl_store_block((void *)(& __gen_e_acsl_write_value),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_write_value)); + __e_acsl_store_block((void *)(& __gen_e_acsl_usleep),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_usleep)); + __e_acsl_store_block((void *)(& __gen_e_acsl_exit),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_exit)); + __e_acsl_store_block((void *)(& __gen_e_acsl_perror),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_perror)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_mutex_unlock), + (size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_mutex_unlock)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_mutex_lock), + (size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_mutex_lock)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_mutex_init), + (size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_mutex_init)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_join),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_join)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_create),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_create)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_cond_wait), + (size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_cond_wait)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_cond_init), + (size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_cond_init)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_cond_broadcast), + (size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_cond_broadcast)); + __e_acsl_store_block((void *)(& read_value),(size_t)1); + __e_acsl_full_init((void *)(& read_value)); + __e_acsl_store_block((void *)(& write_value),(size_t)1); + __e_acsl_full_init((void *)(& write_value)); + __e_acsl_store_block((void *)(& read_mutex),(size_t)4); + __e_acsl_full_init((void *)(& read_mutex)); + __e_acsl_store_block((void *)(& write_mutex),(size_t)4); + __e_acsl_full_init((void *)(& write_mutex)); + __e_acsl_store_block((void *)(& read_cond),(size_t)4); + __e_acsl_full_init((void *)(& read_cond)); + __e_acsl_store_block((void *)(& write_cond),(size_t)4); + __e_acsl_full_init((void *)(& write_cond)); + __e_acsl_store_block((void *)(& read_count),(size_t)4); + __e_acsl_full_init((void *)(& read_count)); + __e_acsl_store_block((void *)(& write_count),(size_t)4); + __e_acsl_full_init((void *)(& write_count)); + __e_acsl_store_block((void *)(values),(size_t)80); + __e_acsl_full_init((void *)(& values)); + __e_acsl_store_block((void *)(& usleep),(size_t)1); + __e_acsl_full_init((void *)(& usleep)); + __e_acsl_store_block((void *)(& __fc_p_ttyname),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_ttyname)); + __e_acsl_store_block((void *)(ttyname),(size_t)32); + __e_acsl_full_init((void *)(& ttyname)); + __e_acsl_store_block((void *)(& Frama_C_entropy_source),(size_t)4); + __e_acsl_full_init((void *)(& Frama_C_entropy_source)); + __e_acsl_store_block((void *)(& exit),(size_t)1); + __e_acsl_full_init((void *)(& exit)); + __e_acsl_store_block((void *)(& free),(size_t)1); + __e_acsl_full_init((void *)(& free)); + __e_acsl_store_block((void *)(& malloc),(size_t)1); + __e_acsl_full_init((void *)(& malloc)); + __e_acsl_store_block((void *)(& __fc_p_random48_counter),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_random48_counter)); + __e_acsl_store_block((void *)(random48_counter),(size_t)6); + __e_acsl_full_init((void *)(& random48_counter)); + __e_acsl_store_block((void *)(& __fc_random48_init),(size_t)4); + __e_acsl_full_init((void *)(& __fc_random48_init)); + __e_acsl_store_block((void *)(& __fc_rand_max),(size_t)8); + __e_acsl_full_init((void *)(& __fc_rand_max)); + __e_acsl_store_block((void *)(& perror),(size_t)1); + __e_acsl_full_init((void *)(& perror)); + __e_acsl_store_block((void *)(& __fc_p_tmpnam),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_tmpnam)); + __e_acsl_store_block((void *)(__fc_tmpnam),(size_t)2048); + __e_acsl_full_init((void *)(& __fc_tmpnam)); + __e_acsl_store_block((void *)(& __fc_p_fopen),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_fopen)); + __e_acsl_store_block((void *)(__fc_fopen),(size_t)128); + __e_acsl_full_init((void *)(& __fc_fopen)); + __e_acsl_store_block((void *)(& stdout),(size_t)8); + __e_acsl_full_init((void *)(& stdout)); + __e_acsl_store_block((void *)(& stdin),(size_t)8); + __e_acsl_full_init((void *)(& stdin)); + __e_acsl_store_block((void *)(& __fc_interrupted),(size_t)4); + __e_acsl_full_init((void *)(& __fc_interrupted)); + __e_acsl_store_block((void *)(& __fc_p_time_tm),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_time_tm)); + __e_acsl_store_block((void *)(& __fc_time_tm),(size_t)36); + __e_acsl_full_init((void *)(& __fc_time_tm)); + __e_acsl_store_block((void *)(& __fc_p_ctime),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_ctime)); + __e_acsl_store_block((void *)(__fc_ctime),(size_t)26); + __e_acsl_full_init((void *)(& __fc_ctime)); + __e_acsl_store_block((void *)(& __fc_time),(size_t)4); + __e_acsl_full_init((void *)(& __fc_time)); + __e_acsl_store_block((void *)(& __fc_p_sigaction),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_sigaction)); + __e_acsl_store_block((void *)(sigaction),(size_t)2080); + __e_acsl_full_init((void *)(& sigaction)); + __e_acsl_store_block((void *)(& pthread_mutex_unlock),(size_t)1); + __e_acsl_full_init((void *)(& pthread_mutex_unlock)); + __e_acsl_store_block((void *)(& pthread_mutex_trylock),(size_t)1); + __e_acsl_full_init((void *)(& pthread_mutex_trylock)); + __e_acsl_store_block((void *)(& pthread_mutex_lock),(size_t)1); + __e_acsl_full_init((void *)(& pthread_mutex_lock)); + __e_acsl_store_block((void *)(& pthread_mutex_init),(size_t)1); + __e_acsl_full_init((void *)(& pthread_mutex_init)); + __e_acsl_store_block((void *)(& pthread_join),(size_t)1); + __e_acsl_full_init((void *)(& pthread_join)); + __e_acsl_store_block((void *)(& pthread_create),(size_t)1); + __e_acsl_full_init((void *)(& pthread_create)); + __e_acsl_store_block((void *)(& pthread_cond_wait),(size_t)1); + __e_acsl_full_init((void *)(& pthread_cond_wait)); + __e_acsl_store_block((void *)(& pthread_cond_init),(size_t)1); + __e_acsl_full_init((void *)(& pthread_cond_init)); + __e_acsl_store_block((void *)(& pthread_cond_broadcast),(size_t)1); + __e_acsl_full_init((void *)(& pthread_cond_broadcast)); + __e_acsl_store_block((void *)(& errno),(size_t)4); + __e_acsl_full_init((void *)(& errno)); + } + return; +} + +void __e_acsl_globals_clean(void) +{ + __e_acsl_delete_block((void *)(& __gen_e_acsl_read_value)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_write_value)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_usleep)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_exit)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_perror)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_mutex_unlock)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_mutex_lock)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_mutex_init)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_join)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_create)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_cond_wait)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_cond_init)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_cond_broadcast)); + __e_acsl_delete_block((void *)(& read_value)); + __e_acsl_delete_block((void *)(& write_value)); + __e_acsl_delete_block((void *)(& read_mutex)); + __e_acsl_delete_block((void *)(& write_mutex)); + __e_acsl_delete_block((void *)(& read_cond)); + __e_acsl_delete_block((void *)(& write_cond)); + __e_acsl_delete_block((void *)(& read_count)); + __e_acsl_delete_block((void *)(& write_count)); + __e_acsl_delete_block((void *)(values)); + __e_acsl_delete_block((void *)(& usleep)); + __e_acsl_delete_block((void *)(& __fc_p_ttyname)); + __e_acsl_delete_block((void *)(ttyname)); + __e_acsl_delete_block((void *)(& Frama_C_entropy_source)); + __e_acsl_delete_block((void *)(& exit)); + __e_acsl_delete_block((void *)(& free)); + __e_acsl_delete_block((void *)(& malloc)); + __e_acsl_delete_block((void *)(& __fc_p_random48_counter)); + __e_acsl_delete_block((void *)(random48_counter)); + __e_acsl_delete_block((void *)(& __fc_random48_init)); + __e_acsl_delete_block((void *)(& __fc_rand_max)); + __e_acsl_delete_block((void *)(& perror)); + __e_acsl_delete_block((void *)(& __fc_p_tmpnam)); + __e_acsl_delete_block((void *)(__fc_tmpnam)); + __e_acsl_delete_block((void *)(& __fc_p_fopen)); + __e_acsl_delete_block((void *)(__fc_fopen)); + __e_acsl_delete_block((void *)(& stdout)); + __e_acsl_delete_block((void *)(& stdin)); + __e_acsl_delete_block((void *)(& __fc_interrupted)); + __e_acsl_delete_block((void *)(& __fc_p_time_tm)); + __e_acsl_delete_block((void *)(& __fc_time_tm)); + __e_acsl_delete_block((void *)(& __fc_p_ctime)); + __e_acsl_delete_block((void *)(__fc_ctime)); + __e_acsl_delete_block((void *)(& __fc_time)); + __e_acsl_delete_block((void *)(& __fc_p_sigaction)); + __e_acsl_delete_block((void *)(sigaction)); + __e_acsl_delete_block((void *)(& pthread_mutex_unlock)); + __e_acsl_delete_block((void *)(& pthread_mutex_trylock)); + __e_acsl_delete_block((void *)(& pthread_mutex_lock)); + __e_acsl_delete_block((void *)(& pthread_mutex_init)); + __e_acsl_delete_block((void *)(& pthread_join)); + __e_acsl_delete_block((void *)(& pthread_create)); + __e_acsl_delete_block((void *)(& pthread_cond_wait)); + __e_acsl_delete_block((void *)(& pthread_cond_init)); + __e_acsl_delete_block((void *)(& pthread_cond_broadcast)); + __e_acsl_delete_block((void *)(& errno)); + return; +} + +int main(void) +{ + int __retres; + pthread_t writers[10]; + pthread_t readers[10]; + int args[10]; + int tmp; + int tmp_0; + int tmp_1; + int tmp_2; + int tmp_5; + int tmp_6; + __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8); + __e_acsl_globals_init(); + __e_acsl_store_block((void *)(& tmp_6),(size_t)4); + __e_acsl_store_block((void *)(& tmp_5),(size_t)4); + __e_acsl_store_block((void *)(& tmp_2),(size_t)4); + __e_acsl_store_block((void *)(& tmp_1),(size_t)4); + __e_acsl_store_block((void *)(& tmp_0),(size_t)4); + __e_acsl_store_block((void *)(& tmp),(size_t)4); + __e_acsl_store_block((void *)(args),(size_t)40); + __e_acsl_store_block((void *)(readers),(size_t)40); + __e_acsl_store_block((void *)(writers),(size_t)40); + __e_acsl_store_block((void *)(& __retres),(size_t)4); + __e_acsl_full_init((void *)(& tmp)); + tmp = __gen_e_acsl_pthread_mutex_init(& write_mutex, + (pthread_mutexattr_t const *)0); + if (tmp != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_7); + __gen_e_acsl_exit(1); + } + __e_acsl_full_init((void *)(& tmp_0)); + tmp_0 = __gen_e_acsl_pthread_cond_init(& write_cond, + (pthread_condattr_t const *)0); + if (tmp_0 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_8); + __gen_e_acsl_exit(1); + } + __e_acsl_full_init((void *)(& tmp_1)); + tmp_1 = __gen_e_acsl_pthread_mutex_init(& read_mutex, + (pthread_mutexattr_t const *)0); + if (tmp_1 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_9); + __gen_e_acsl_exit(1); + } + __e_acsl_full_init((void *)(& tmp_2)); + tmp_2 = __gen_e_acsl_pthread_cond_init(& read_cond, + (pthread_condattr_t const *)0); + if (tmp_2 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_10); + __gen_e_acsl_exit(1); + } + { + int i = 0; + __e_acsl_store_block((void *)(& i),(size_t)4); + __e_acsl_full_init((void *)(& i)); + while (i < 10) { + __e_acsl_initialize((void *)(& args[i]),sizeof(int)); + args[i] = i; + __gen_e_acsl_pthread_create(& writers[i],(pthread_attr_t const *)0, + & __gen_e_acsl_write_value, + (void *)(& args[i])); + __gen_e_acsl_pthread_create(& readers[i],(pthread_attr_t const *)0, + & __gen_e_acsl_read_value, + (void *)(& args[i])); + __e_acsl_full_init((void *)(& i)); + i ++; + } + __e_acsl_delete_block((void *)(& i)); + } + while (1) { + int res = pthread_mutex_trylock(& write_mutex); + __e_acsl_store_block((void *)(& res),(size_t)4); + __e_acsl_full_init((void *)(& res)); + if (res == 0) { + int done = write_count == 10; + __e_acsl_store_block((void *)(& done),(size_t)4); + __e_acsl_full_init((void *)(& done)); + __gen_e_acsl_pthread_mutex_unlock(& write_mutex); + if (done) { + __e_acsl_delete_block((void *)(& res)); + __e_acsl_delete_block((void *)(& done)); + break; + } + __e_acsl_delete_block((void *)(& done)); + } + else + if (res != 16) __gen_e_acsl_perror(__gen_e_acsl_literal_string_11); + __gen_e_acsl_usleep((unsigned int)100); + __e_acsl_delete_block((void *)(& res)); + } + while (1) { + int res_0 = pthread_mutex_trylock(& read_mutex); + __e_acsl_store_block((void *)(& res_0),(size_t)4); + __e_acsl_full_init((void *)(& res_0)); + if (res_0 == 0) { + int done_0 = read_count == 10; + __e_acsl_store_block((void *)(& done_0),(size_t)4); + __e_acsl_full_init((void *)(& done_0)); + __gen_e_acsl_pthread_mutex_unlock(& read_mutex); + if (done_0) { + __e_acsl_delete_block((void *)(& res_0)); + __e_acsl_delete_block((void *)(& done_0)); + break; + } + __e_acsl_delete_block((void *)(& done_0)); + } + else + if (res_0 != 16) __gen_e_acsl_perror(__gen_e_acsl_literal_string_12); + __gen_e_acsl_usleep((unsigned int)100); + __e_acsl_delete_block((void *)(& res_0)); + } + __e_acsl_full_init((void *)(& tmp_5)); + tmp_5 = __gen_e_acsl_pthread_cond_broadcast(& write_cond); + if (tmp_5 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_13); + __gen_e_acsl_exit(11); + } + { + int i_0 = 0; + __e_acsl_store_block((void *)(& i_0),(size_t)4); + __e_acsl_full_init((void *)(& i_0)); + while (i_0 < 10) { + __gen_e_acsl_pthread_join(writers[i_0],(void **)0); + __e_acsl_full_init((void *)(& i_0)); + i_0 ++; + } + __e_acsl_delete_block((void *)(& i_0)); + } + __e_acsl_full_init((void *)(& tmp_6)); + tmp_6 = __gen_e_acsl_pthread_cond_broadcast(& read_cond); + if (tmp_6 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_14); + __gen_e_acsl_exit(12); + } + { + int i_1 = 0; + __e_acsl_store_block((void *)(& i_1),(size_t)4); + __e_acsl_full_init((void *)(& i_1)); + while (i_1 < 10) { + __gen_e_acsl_pthread_join(readers[i_1],(void **)0); + __e_acsl_full_init((void *)(& i_1)); + i_1 ++; + } + __e_acsl_delete_block((void *)(& i_1)); + } + __e_acsl_full_init((void *)(& __retres)); + __retres = 0; + __e_acsl_delete_block((void *)(& tmp_6)); + __e_acsl_delete_block((void *)(& tmp_5)); + __e_acsl_delete_block((void *)(& tmp_2)); + __e_acsl_delete_block((void *)(& tmp_1)); + __e_acsl_delete_block((void *)(& tmp_0)); + __e_acsl_delete_block((void *)(& tmp)); + __e_acsl_delete_block((void *)(args)); + __e_acsl_delete_block((void *)(readers)); + __e_acsl_delete_block((void *)(writers)); + __e_acsl_delete_block((void *)(& __retres)); + __e_acsl_globals_clean(); + __e_acsl_memory_clean(); + return __retres; +} + + diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/gen_sequential_threads.c b/src/plugins/e-acsl/tests/concurrency/oracle/gen_sequential_threads.c new file mode 100644 index 0000000000000000000000000000000000000000..7f1c616d434e934b4beb8b79bbc409ce4c68140f --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/oracle/gen_sequential_threads.c @@ -0,0 +1,547 @@ +/* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" +#include "stddef.h" +#include "stdint.h" +#include "stdio.h" +#include "stdlib.h" +#include "time.h" +extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; + +/*@ requires valid_thread: \valid(thread); + requires valid_null_attr: attr == \null || \valid_read(attr); + requires valid_routine: \valid_function(start_routine); + requires valid_null_arg: arg == \null || \valid((char *)arg); + ensures + success_or_error: + \result == 0 || \result == 11 || \result == 22 || \result == 1; + assigns *thread, \result; + assigns *thread \from *attr; + assigns \result \from (indirect: *attr); + */ +int __gen_e_acsl_pthread_create(pthread_t * restrict thread, + pthread_attr_t const * restrict attr, + void *(*start_routine)(void *), + void * restrict arg); + +/*@ requires valid_or_null_retval: retval == \null || \valid(retval); + ensures + success_or_error: + \result == 0 || \result == 35 || \result == 22 || \result == 3; + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + + behavior ignore_retval: + assumes null_retval: retval == \null; + assigns \result; + assigns \result \from (indirect: thread); + + behavior use_retval: + assumes valid_retval: \valid(retval); + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + */ +int __gen_e_acsl_pthread_join(pthread_t thread, void **retval); + +int *values[10]; +void *write_value(void *arg) +{ + void *__retres; + __e_acsl_store_block((void *)(& __retres),(size_t)8); + __e_acsl_store_block((void *)(& arg),(size_t)8); + int idx = *((int *)arg); + __e_acsl_store_block((void *)(& idx),(size_t)4); + __e_acsl_full_init((void *)(& idx)); + __e_acsl_initialize((void *)(& values[idx]),sizeof(int *)); + values[idx] = (int *)malloc(sizeof(int)); + __e_acsl_initialize((void *)values[idx],sizeof(int)); + *(values[idx]) = idx; + __e_acsl_full_init((void *)(& __retres)); + __retres = (void *)0; + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& idx)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; +} + +void *read_value(void *arg) +{ + void *__retres; + __e_acsl_store_block((void *)(& __retres),(size_t)8); + __e_acsl_store_block((void *)(& arg),(size_t)8); + int idx = *((int *)arg); + __e_acsl_store_block((void *)(& idx),(size_t)4); + __e_acsl_full_init((void *)(& idx)); + { + int __gen_e_acsl_initialized; + int __gen_e_acsl_and; + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"*(values[idx])", + 0,*(values[idx])); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"idx",0,idx); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"&values[idx]", + (void *)(& values[idx])); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(int *)",0,sizeof(int *)); + __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& values[idx]), + sizeof(int *)); + if (__gen_e_acsl_initialized) { + int __gen_e_acsl_valid_read; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2, + "values[idx]",(void *)values[idx]); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"idx",0,idx); + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "RTE"; + __gen_e_acsl_assert_data_3.pred_txt = "index_bound: idx < 10"; + __gen_e_acsl_assert_data_3.file = "sequential_threads.c"; + __gen_e_acsl_assert_data_3.fct = "read_value"; + __gen_e_acsl_assert_data_3.line = 17; + __e_acsl_assert(idx < 10,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,"idx",0,idx); + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "RTE"; + __gen_e_acsl_assert_data_4.pred_txt = "index_bound: 0 <= idx"; + __gen_e_acsl_assert_data_4.file = "sequential_threads.c"; + __gen_e_acsl_assert_data_4.fct = "read_value"; + __gen_e_acsl_assert_data_4.line = 17; + __e_acsl_assert(0 <= idx,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)values[idx], + sizeof(int), + (void *)values[idx], + (void *)(& values[idx])); + __gen_e_acsl_and = __gen_e_acsl_valid_read; + } + else __gen_e_acsl_and = 0; + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "RTE"; + __gen_e_acsl_assert_data_2.pred_txt = "mem_access: \\valid_read(values[idx])"; + __gen_e_acsl_assert_data_2.file = "sequential_threads.c"; + __gen_e_acsl_assert_data_2.fct = "read_value"; + __gen_e_acsl_assert_data_2.line = 17; + __e_acsl_assert(__gen_e_acsl_and,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"idx",0,idx); + __gen_e_acsl_assert_data_5.blocking = 1; + __gen_e_acsl_assert_data_5.kind = "RTE"; + __gen_e_acsl_assert_data_5.pred_txt = "index_bound: idx < 10"; + __gen_e_acsl_assert_data_5.file = "sequential_threads.c"; + __gen_e_acsl_assert_data_5.fct = "read_value"; + __gen_e_acsl_assert_data_5.line = 17; + __e_acsl_assert(idx < 10,& __gen_e_acsl_assert_data_5); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_6 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_6,"idx",0,idx); + __gen_e_acsl_assert_data_6.blocking = 1; + __gen_e_acsl_assert_data_6.kind = "RTE"; + __gen_e_acsl_assert_data_6.pred_txt = "index_bound: 0 <= idx"; + __gen_e_acsl_assert_data_6.file = "sequential_threads.c"; + __gen_e_acsl_assert_data_6.fct = "read_value"; + __gen_e_acsl_assert_data_6.line = 17; + __e_acsl_assert(0 <= idx,& __gen_e_acsl_assert_data_6); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_6); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Assertion"; + __gen_e_acsl_assert_data.pred_txt = "*(values[idx]) == idx"; + __gen_e_acsl_assert_data.file = "sequential_threads.c"; + __gen_e_acsl_assert_data.fct = "read_value"; + __gen_e_acsl_assert_data.line = 17; + __e_acsl_assert(*(values[idx]) == idx,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + } + /*@ assert *(values[idx]) == idx; */ ; + free((void *)values[idx]); + __e_acsl_full_init((void *)(& __retres)); + __retres = (void *)0; + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& idx)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; +} + +/*@ requires valid_or_null_retval: retval == \null || \valid(retval); + ensures + success_or_error: + \result == 0 || \result == 35 || \result == 22 || \result == 3; + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + + behavior ignore_retval: + assumes null_retval: retval == \null; + assigns \result; + assigns \result \from (indirect: thread); + + behavior use_retval: + assumes valid_retval: \valid(retval); + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + */ +int __gen_e_acsl_pthread_join(pthread_t thread, void **retval) +{ + __e_acsl_contract_t *__gen_e_acsl_contract; + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_or; + int __gen_e_acsl_valid_2; + __e_acsl_store_block((void *)(& retval),(size_t)8); + __e_acsl_store_block((void *)(& thread),(size_t)4); + __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval", + (void *)retval); + if (retval == (void **)0) __gen_e_acsl_or = 1; + else { + int __gen_e_acsl_valid; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval", + (void *)retval); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(void *)",0,sizeof(void *)); + __gen_e_acsl_valid = __e_acsl_valid((void *)retval,sizeof(void *), + (void *)retval,(void *)(& retval)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid(retval)",0,__gen_e_acsl_valid); + __gen_e_acsl_or = __gen_e_acsl_valid; + } + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_or_null_retval: retval == \\null || \\valid(retval)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_join"; + __gen_e_acsl_assert_data.line = 247; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0, + retval == (void **)0); + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)retval,sizeof(void *), + (void *)retval,(void *)(& retval)); + __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1, + __gen_e_acsl_valid_2); + } + __retres = pthread_join(thread,retval); + { + int __gen_e_acsl_or_2; + int __gen_e_acsl_or_3; + int __gen_e_acsl_or_4; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or_2 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_2 = __retres == 35; + } + if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_3 = __retres == 22; + } + if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_4 = __retres == 3; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Postcondition"; + __gen_e_acsl_assert_data_2.pred_txt = "success_or_error:\n \\result == 0 || \\result == 35 || \\result == 22 || \\result == 3"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_join"; + __gen_e_acsl_assert_data_2.line = 251; + __e_acsl_assert(__gen_e_acsl_or_4,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_contract_clean(__gen_e_acsl_contract); + __e_acsl_delete_block((void *)(& retval)); + __e_acsl_delete_block((void *)(& thread)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires valid_thread: \valid(thread); + requires valid_null_attr: attr == \null || \valid_read(attr); + requires valid_routine: \valid_function(start_routine); + requires valid_null_arg: arg == \null || \valid((char *)arg); + ensures + success_or_error: + \result == 0 || \result == 11 || \result == 22 || \result == 1; + assigns *thread, \result; + assigns *thread \from *attr; + assigns \result \from (indirect: *attr); + */ +int __gen_e_acsl_pthread_create(pthread_t * restrict thread, + pthread_attr_t const * restrict attr, + void *(*start_routine)(void *), + void * restrict arg) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + int __gen_e_acsl_or; + int __gen_e_acsl_or_2; + __e_acsl_store_block((void *)(& arg),(size_t)8); + __e_acsl_store_block((void *)(& start_routine),(size_t)8); + __e_acsl_store_block((void *)(& attr),(size_t)8); + __e_acsl_store_block((void *)(& thread),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"thread", + (void *)thread); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_t)",0,sizeof(pthread_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)thread,sizeof(pthread_t), + (void *)thread,(void *)(& thread)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid(thread)",0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_thread: \\valid(thread)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_create"; + __gen_e_acsl_assert_data.line = 223; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr", + (void *)attr); + if (attr == (pthread_attr_t const *)0) __gen_e_acsl_or = 1; + else { + int __gen_e_acsl_valid_read; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr", + (void *)attr); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(pthread_attr_t const)",0, + sizeof(pthread_attr_t const)); + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attr, + sizeof(pthread_attr_t const), + (void *)attr, + (void *)(& attr)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "\\valid_read(attr)",0, + __gen_e_acsl_valid_read); + __gen_e_acsl_or = __gen_e_acsl_valid_read; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Precondition"; + __gen_e_acsl_assert_data_2.pred_txt = "valid_null_attr: attr == \\null || \\valid_read(attr)"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_create"; + __gen_e_acsl_assert_data_2.line = 224; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg); + if (arg == (void *)0) __gen_e_acsl_or_2 = 1; + else { + int __gen_e_acsl_valid_2; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4, + "sizeof(char)",0,sizeof(char)); + __gen_e_acsl_valid_2 = __e_acsl_valid(arg,sizeof(char),arg, + (void *)(& arg)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, + "\\valid((char *)arg)",0, + __gen_e_acsl_valid_2); + __gen_e_acsl_or_2 = __gen_e_acsl_valid_2; + } + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "Precondition"; + __gen_e_acsl_assert_data_4.pred_txt = "valid_null_arg: arg == \\null || \\valid((char *)arg)"; + __gen_e_acsl_assert_data_4.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_4.fct = "pthread_create"; + __gen_e_acsl_assert_data_4.line = 226; + __e_acsl_assert(__gen_e_acsl_or_2,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + } + __retres = __e_acsl_pthread_create(thread,attr,start_routine,arg); + { + int __gen_e_acsl_or_3; + int __gen_e_acsl_or_4; + int __gen_e_acsl_or_5; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or_3 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + __gen_e_acsl_or_3 = __retres == 11; + } + if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + __gen_e_acsl_or_4 = __retres == 22; + } + if (__gen_e_acsl_or_4) __gen_e_acsl_or_5 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + __gen_e_acsl_or_5 = __retres == 1; + } + __gen_e_acsl_assert_data_5.blocking = 1; + __gen_e_acsl_assert_data_5.kind = "Postcondition"; + __gen_e_acsl_assert_data_5.pred_txt = "success_or_error:\n \\result == 0 || \\result == 11 || \\result == 22 || \\result == 1"; + __gen_e_acsl_assert_data_5.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_5.fct = "pthread_create"; + __gen_e_acsl_assert_data_5.line = 230; + __e_acsl_assert(__gen_e_acsl_or_5,& __gen_e_acsl_assert_data_5); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5); + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& start_routine)); + __e_acsl_delete_block((void *)(& attr)); + __e_acsl_delete_block((void *)(& thread)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +void __e_acsl_globals_init(void) +{ + static char __e_acsl_already_run = 0; + if (! __e_acsl_already_run) { + __e_acsl_already_run = 1; + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_join),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_join)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_create),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_create)); + __e_acsl_store_block((void *)(& read_value),(size_t)1); + __e_acsl_full_init((void *)(& read_value)); + __e_acsl_store_block((void *)(& write_value),(size_t)1); + __e_acsl_full_init((void *)(& write_value)); + __e_acsl_store_block((void *)(values),(size_t)80); + __e_acsl_full_init((void *)(& values)); + __e_acsl_store_block((void *)(& free),(size_t)1); + __e_acsl_full_init((void *)(& free)); + __e_acsl_store_block((void *)(& malloc),(size_t)1); + __e_acsl_full_init((void *)(& malloc)); + __e_acsl_store_block((void *)(& __fc_p_random48_counter),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_random48_counter)); + __e_acsl_store_block((void *)(random48_counter),(size_t)6); + __e_acsl_full_init((void *)(& random48_counter)); + __e_acsl_store_block((void *)(& __fc_random48_init),(size_t)4); + __e_acsl_full_init((void *)(& __fc_random48_init)); + __e_acsl_store_block((void *)(& __fc_rand_max),(size_t)8); + __e_acsl_full_init((void *)(& __fc_rand_max)); + __e_acsl_store_block((void *)(& __fc_interrupted),(size_t)4); + __e_acsl_full_init((void *)(& __fc_interrupted)); + __e_acsl_store_block((void *)(& __fc_p_time_tm),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_time_tm)); + __e_acsl_store_block((void *)(& __fc_time_tm),(size_t)36); + __e_acsl_full_init((void *)(& __fc_time_tm)); + __e_acsl_store_block((void *)(& __fc_p_ctime),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_ctime)); + __e_acsl_store_block((void *)(__fc_ctime),(size_t)26); + __e_acsl_full_init((void *)(& __fc_ctime)); + __e_acsl_store_block((void *)(& __fc_time),(size_t)4); + __e_acsl_full_init((void *)(& __fc_time)); + __e_acsl_store_block((void *)(& __fc_p_sigaction),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_sigaction)); + __e_acsl_store_block((void *)(sigaction),(size_t)2080); + __e_acsl_full_init((void *)(& sigaction)); + __e_acsl_store_block((void *)(& pthread_join),(size_t)1); + __e_acsl_full_init((void *)(& pthread_join)); + __e_acsl_store_block((void *)(& pthread_create),(size_t)1); + __e_acsl_full_init((void *)(& pthread_create)); + } + return; +} + +void __e_acsl_globals_clean(void) +{ + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_join)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_create)); + __e_acsl_delete_block((void *)(& read_value)); + __e_acsl_delete_block((void *)(& write_value)); + __e_acsl_delete_block((void *)(values)); + __e_acsl_delete_block((void *)(& free)); + __e_acsl_delete_block((void *)(& malloc)); + __e_acsl_delete_block((void *)(& __fc_p_random48_counter)); + __e_acsl_delete_block((void *)(random48_counter)); + __e_acsl_delete_block((void *)(& __fc_random48_init)); + __e_acsl_delete_block((void *)(& __fc_rand_max)); + __e_acsl_delete_block((void *)(& __fc_interrupted)); + __e_acsl_delete_block((void *)(& __fc_p_time_tm)); + __e_acsl_delete_block((void *)(& __fc_time_tm)); + __e_acsl_delete_block((void *)(& __fc_p_ctime)); + __e_acsl_delete_block((void *)(__fc_ctime)); + __e_acsl_delete_block((void *)(& __fc_time)); + __e_acsl_delete_block((void *)(& __fc_p_sigaction)); + __e_acsl_delete_block((void *)(sigaction)); + __e_acsl_delete_block((void *)(& pthread_join)); + __e_acsl_delete_block((void *)(& pthread_create)); + return; +} + +int main(void) +{ + int __retres; + pthread_t t; + int args[10]; + __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8); + __e_acsl_globals_init(); + __e_acsl_store_block((void *)(args),(size_t)40); + __e_acsl_store_block((void *)(& t),(size_t)4); + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int i = 0; + __e_acsl_store_block((void *)(& i),(size_t)4); + __e_acsl_full_init((void *)(& i)); + while (i < 10) { + __e_acsl_initialize((void *)(& args[i]),sizeof(int)); + args[i] = i; + __gen_e_acsl_pthread_create(& t,(pthread_attr_t const *)0, + & write_value,(void *)(& args[i])); + __gen_e_acsl_pthread_join(t,(void **)0); + __e_acsl_full_init((void *)(& i)); + i ++; + } + __e_acsl_delete_block((void *)(& i)); + } + { + int i_0 = 0; + __e_acsl_store_block((void *)(& i_0),(size_t)4); + __e_acsl_full_init((void *)(& i_0)); + while (i_0 < 10) { + __gen_e_acsl_pthread_create(& t,(pthread_attr_t const *)0,& read_value, + (void *)(& args[i_0])); + __gen_e_acsl_pthread_join(t,(void **)0); + __e_acsl_full_init((void *)(& i_0)); + i_0 ++; + } + __e_acsl_delete_block((void *)(& i_0)); + } + __e_acsl_full_init((void *)(& __retres)); + __retres = 0; + __e_acsl_delete_block((void *)(args)); + __e_acsl_delete_block((void *)(& t)); + __e_acsl_delete_block((void *)(& __retres)); + __e_acsl_globals_clean(); + __e_acsl_memory_clean(); + return __retres; +} + + diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_debug.c b/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_debug.c new file mode 100644 index 0000000000000000000000000000000000000000..5de16ad24bdc0e94a269f0bc95a9dca462817215 --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_debug.c @@ -0,0 +1,1652 @@ +/* Generated by Frama-C */ +#include "errno.h" +#include "pthread.h" +#include "sched.h" +#include "signal.h" +#include "stddef.h" +#include "stdint.h" +#include "stdio.h" +#include "stdlib.h" +#include "time.h" +#include "unistd.h" +char *__gen_e_acsl_literal_string_2; +char *__gen_e_acsl_literal_string_5; +char *__gen_e_acsl_literal_string_3; +char *__gen_e_acsl_literal_string_6; +char *__gen_e_acsl_literal_string_11; +char *__gen_e_acsl_literal_string_12; +char *__gen_e_acsl_literal_string; +char *__gen_e_acsl_literal_string_4; +char *__gen_e_acsl_literal_string_7; +char *__gen_e_acsl_literal_string_8; +char *__gen_e_acsl_literal_string_9; +char *__gen_e_acsl_literal_string_10; +char *__gen_e_acsl_literal_string_13; +char *__gen_e_acsl_literal_string_14; +extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; + +/*@ requires valid_cond: \valid(cond); + ensures sucess: \result == 0; + assigns \result; + assigns \result \from \nothing; + */ +int __gen_e_acsl_pthread_cond_broadcast(pthread_cond_t *cond); + +/*@ requires valid_cond: \valid(cond); + requires valid_null_attr: attr == \null || \valid_read(attr); + ensures initialization: cond: \initialized(\old(cond)); + ensures success: \result == 0; + assigns *cond, \result; + assigns *cond \from *attr; + assigns \result \from \nothing; + */ +int __gen_e_acsl_pthread_cond_init(pthread_cond_t * restrict cond, + pthread_condattr_t const * restrict attr); + +/*@ requires valid_cond: \valid(cond); + requires valid_mutex: \valid(mutex); + ensures success: \result == 0; + assigns \result; + assigns \result \from \nothing; + */ +int __gen_e_acsl_pthread_cond_wait(pthread_cond_t * restrict cond, + pthread_mutex_t * restrict mutex); + +/*@ requires valid_thread: \valid(thread); + requires valid_null_attr: attr == \null || \valid_read(attr); + requires valid_routine: \valid_function(start_routine); + requires valid_null_arg: arg == \null || \valid((char *)arg); + ensures + success_or_error: + \result == 0 || \result == 11 || \result == 22 || \result == 1; + assigns *thread, \result; + assigns *thread \from *attr; + assigns \result \from (indirect: *attr); + */ +int __gen_e_acsl_pthread_create(pthread_t * restrict thread, + pthread_attr_t const * restrict attr, + void *(*start_routine)(void *), + void * restrict arg); + +/*@ requires valid_or_null_retval: retval == \null || \valid(retval); + ensures + success_or_error: + \result == 0 || \result == 35 || \result == 22 || \result == 3; + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + + behavior ignore_retval: + assumes null_retval: retval == \null; + assigns \result; + assigns \result \from (indirect: thread); + + behavior use_retval: + assumes valid_retval: \valid(retval); + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + */ +int __gen_e_acsl_pthread_join(pthread_t thread, void **retval); + +/*@ requires mutex_valid: \valid(mutex); + requires attrs_valid_or_null: attrs == \null || \valid_read(attrs); + ensures + initialization: success_or_error: + (\result == 0 && \initialized(\old(mutex))) || \result == 11 || + \result == 12 || \result == 1 || \result == 22; + assigns *mutex, \result; + assigns *mutex \from *mutex, *attrs; + assigns \result \from (indirect: *mutex), (indirect: *attrs); + */ +int __gen_e_acsl_pthread_mutex_init(pthread_mutex_t * restrict mutex, + pthread_mutexattr_t const * restrict attrs); + +/*@ requires mutex_valid: \valid(mutex); + ensures + success_or_error: + \result == 0 || \result == 11 || \result == 22 || \result == 35; + assigns *mutex, \result; + assigns *mutex \from *mutex; + assigns \result \from (indirect: *mutex); + */ +int __gen_e_acsl_pthread_mutex_lock(pthread_mutex_t *mutex); + +/*@ requires mutex_valid: \valid(mutex); + ensures success_or_error: \result == 0 || \result == 1; + assigns *mutex, \result; + assigns *mutex \from *mutex; + assigns \result \from (indirect: *mutex); + */ +int __gen_e_acsl_pthread_mutex_unlock(pthread_mutex_t *mutex); + +/*@ requires valid_string_s: valid_read_string(s); + assigns __fc_stdout; + assigns __fc_stdout \from __fc_errno, *(s + (0 .. strlen{Old}(s))); + */ +void __gen_e_acsl_perror(char const *s); + +/*@ exits status: \exit_status == \old(status); + ensures never_terminates: \false; + + assigns \exit_status \from status; + */ +void __gen_e_acsl_exit(int status); + +/*@ ensures result_ok_or_error: \result == 0 || \result == -1; + assigns \result, Frama_C_entropy_source; + assigns \result + \from (indirect: usec), (indirect: Frama_C_entropy_source); + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +int __gen_e_acsl_usleep(useconds_t usec); + +/*@ ensures + \let idx = *((int *)\old(arg)); + \valid(values[idx]) && \initialized(values[idx]); + */ +void *__gen_e_acsl_write_value(void *arg); + +/*@ requires + !(\let idx = *((int *)arg); + \valid_read(values[idx]) && \initialized(values[idx])); + */ +void *__gen_e_acsl_read_value(void *arg); + +/*@ requires + !(\let idx = *((int *)arg); + \valid_read(values[idx]) && \initialized(values[idx])); + */ +void *__gen_e_acsl_read_value(void *arg) +{ + void *__retres; + __e_acsl_store_block((void *)(& __retres),(size_t)8); + { + int __gen_e_acsl_idx; + int __gen_e_acsl_initialized; + int __gen_e_acsl_and; + int __gen_e_acsl_and_2; + __e_acsl_store_block((void *)(& arg),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"*((int *)arg)", + 0,*((int *)arg)); + __gen_e_acsl_idx = *((int *)arg); + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"&values[idx]", + (void *)(& values[__gen_e_acsl_idx])); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int *)",0,sizeof(int *)); + __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& values[__gen_e_acsl_idx]), + sizeof(int *)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\initialized(&values[idx])",0, + __gen_e_acsl_initialized); + if (__gen_e_acsl_initialized) { + int __gen_e_acsl_valid_read; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]", + (void *)values[__gen_e_acsl_idx]); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "RTE"; + __gen_e_acsl_assert_data_2.pred_txt = "index_bound: __gen_e_acsl_idx < 10"; + __gen_e_acsl_assert_data_2.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_2.fct = "read_value"; + __gen_e_acsl_assert_data_2.line = 61; + __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "RTE"; + __gen_e_acsl_assert_data_3.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx"; + __gen_e_acsl_assert_data_3.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_3.fct = "read_value"; + __gen_e_acsl_assert_data_3.line = 61; + __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)values[__gen_e_acsl_idx], + sizeof(int), + (void *)values[__gen_e_acsl_idx], + (void *)(& values[__gen_e_acsl_idx])); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid_read(values[idx])",0, + __gen_e_acsl_valid_read); + __gen_e_acsl_and = __gen_e_acsl_valid_read; + } + else __gen_e_acsl_and = 0; + if (__gen_e_acsl_and) { + int __gen_e_acsl_initialized_2; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]", + (void *)values[__gen_e_acsl_idx]); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "RTE"; + __gen_e_acsl_assert_data_4.pred_txt = "index_bound: __gen_e_acsl_idx < 10"; + __gen_e_acsl_assert_data_4.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_4.fct = "read_value"; + __gen_e_acsl_assert_data_4.line = 61; + __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_5.blocking = 1; + __gen_e_acsl_assert_data_5.kind = "RTE"; + __gen_e_acsl_assert_data_5.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx"; + __gen_e_acsl_assert_data_5.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_5.fct = "read_value"; + __gen_e_acsl_assert_data_5.line = 61; + __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_5); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)values[__gen_e_acsl_idx], + sizeof(int)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\initialized(values[idx])",0, + __gen_e_acsl_initialized_2); + __gen_e_acsl_and_2 = __gen_e_acsl_initialized_2; + } + else __gen_e_acsl_and_2 = 0; + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "!(\\let idx = *((int *)arg);\n \\valid_read(values[idx]) && \\initialized(values[idx]))"; + __gen_e_acsl_assert_data.file = "parallel_threads.c"; + __gen_e_acsl_assert_data.fct = "read_value"; + __gen_e_acsl_assert_data.line = 60; + __e_acsl_assert(! __gen_e_acsl_and_2,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + } + __retres = read_value(arg); + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; +} + +/*@ ensures + \let idx = *((int *)\old(arg)); + \valid(values[idx]) && \initialized(values[idx]); + */ +void *__gen_e_acsl_write_value(void *arg) +{ + void *__gen_e_acsl_at; + void *__retres; + __e_acsl_store_block((void *)(& __retres),(size_t)8); + __e_acsl_store_block((void *)(& arg),(size_t)8); + __gen_e_acsl_at = arg; + __retres = write_value(arg); + { + int __gen_e_acsl_idx; + int __gen_e_acsl_initialized; + int __gen_e_acsl_and; + int __gen_e_acsl_and_2; + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "*((int *)\\old(arg))",0, + *((int *)__gen_e_acsl_at)); + __gen_e_acsl_idx = *((int *)__gen_e_acsl_at); + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"&values[idx]", + (void *)(& values[__gen_e_acsl_idx])); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int *)",0,sizeof(int *)); + __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& values[__gen_e_acsl_idx]), + sizeof(int *)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\initialized(&values[idx])",0, + __gen_e_acsl_initialized); + if (__gen_e_acsl_initialized) { + int __gen_e_acsl_valid; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]", + (void *)values[__gen_e_acsl_idx]); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "RTE"; + __gen_e_acsl_assert_data_2.pred_txt = "index_bound: __gen_e_acsl_idx < 10"; + __gen_e_acsl_assert_data_2.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_2.fct = "write_value"; + __gen_e_acsl_assert_data_2.line = 32; + __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "RTE"; + __gen_e_acsl_assert_data_3.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx"; + __gen_e_acsl_assert_data_3.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_3.fct = "write_value"; + __gen_e_acsl_assert_data_3.line = 32; + __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_valid = __e_acsl_valid((void *)values[__gen_e_acsl_idx], + sizeof(int), + (void *)values[__gen_e_acsl_idx], + (void *)(& values[__gen_e_acsl_idx])); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid(values[idx])",0, + __gen_e_acsl_valid); + __gen_e_acsl_and = __gen_e_acsl_valid; + } + else __gen_e_acsl_and = 0; + if (__gen_e_acsl_and) { + int __gen_e_acsl_initialized_2; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"values[idx]", + (void *)values[__gen_e_acsl_idx]); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "RTE"; + __gen_e_acsl_assert_data_4.pred_txt = "index_bound: __gen_e_acsl_idx < 10"; + __gen_e_acsl_assert_data_4.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_4.fct = "write_value"; + __gen_e_acsl_assert_data_4.line = 32; + __e_acsl_assert(__gen_e_acsl_idx < 10,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5, + "__gen_e_acsl_idx",0,__gen_e_acsl_idx); + __gen_e_acsl_assert_data_5.blocking = 1; + __gen_e_acsl_assert_data_5.kind = "RTE"; + __gen_e_acsl_assert_data_5.pred_txt = "index_bound: 0 <= __gen_e_acsl_idx"; + __gen_e_acsl_assert_data_5.file = "parallel_threads.c"; + __gen_e_acsl_assert_data_5.fct = "write_value"; + __gen_e_acsl_assert_data_5.line = 32; + __e_acsl_assert(0 <= __gen_e_acsl_idx,& __gen_e_acsl_assert_data_5); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)values[__gen_e_acsl_idx], + sizeof(int)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\initialized(values[idx])",0, + __gen_e_acsl_initialized_2); + __gen_e_acsl_and_2 = __gen_e_acsl_initialized_2; + } + else __gen_e_acsl_and_2 = 0; + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Postcondition"; + __gen_e_acsl_assert_data.pred_txt = "\\let idx = *((int *)\\old(arg));\n \\valid(values[idx]) && \\initialized(values[idx])"; + __gen_e_acsl_assert_data.file = "parallel_threads.c"; + __gen_e_acsl_assert_data.fct = "write_value"; + __gen_e_acsl_assert_data.line = 31; + __e_acsl_assert(__gen_e_acsl_and_2,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ ensures result_ok_or_error: \result == 0 || \result == -1; + assigns \result, Frama_C_entropy_source; + assigns \result + \from (indirect: usec), (indirect: Frama_C_entropy_source); + assigns Frama_C_entropy_source \from Frama_C_entropy_source; + */ +int __gen_e_acsl_usleep(useconds_t usec) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + __e_acsl_store_block((void *)(& usec),(size_t)4); + __retres = usleep(usec); + { + int __gen_e_acsl_or; + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\result",0, + __retres); + __gen_e_acsl_or = __retres == -1; + } + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Postcondition"; + __gen_e_acsl_assert_data.pred_txt = "result_ok_or_error: \\result == 0 || \\result == -1"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/unistd.h"; + __gen_e_acsl_assert_data.fct = "usleep"; + __gen_e_acsl_assert_data.line = 1119; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_delete_block((void *)(& usec)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ exits status: \exit_status == \old(status); + ensures never_terminates: \false; + + assigns \exit_status \from status; + */ +void __gen_e_acsl_exit(int status) +{ + __e_acsl_store_block((void *)(& status),(size_t)4); + exit(status); + { + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Postcondition"; + __gen_e_acsl_assert_data.pred_txt = "never_terminates: \\false"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/stdlib.h"; + __gen_e_acsl_assert_data.fct = "exit"; + __gen_e_acsl_assert_data.line = 473; + __e_acsl_assert(0,& __gen_e_acsl_assert_data); + __e_acsl_delete_block((void *)(& status)); + return; + } +} + +/*@ requires valid_string_s: valid_read_string(s); + assigns __fc_stdout; + assigns __fc_stdout \from __fc_errno, *(s + (0 .. strlen{Old}(s))); + */ +void __gen_e_acsl_perror(char const *s) +{ + __e_acsl_store_block((void *)(& s),(size_t)8); + perror(s); + __e_acsl_delete_block((void *)(& s)); + return; +} + +/*@ requires mutex_valid: \valid(mutex); + ensures success_or_error: \result == 0 || \result == 1; + assigns *mutex, \result; + assigns *mutex \from *mutex; + assigns \result \from (indirect: *mutex); + */ +int __gen_e_acsl_pthread_mutex_unlock(pthread_mutex_t *mutex) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + __e_acsl_store_block((void *)(& mutex),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"mutex", + (void *)mutex); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_mutex_t)",0, + sizeof(pthread_mutex_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)mutex, + sizeof(pthread_mutex_t), + (void *)mutex,(void *)(& mutex)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(mutex)", + 0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "mutex_valid: \\valid(mutex)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_mutex_unlock"; + __gen_e_acsl_assert_data.line = 313; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + } + __retres = pthread_mutex_unlock(mutex); + { + int __gen_e_acsl_or; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or = __retres == 1; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Postcondition"; + __gen_e_acsl_assert_data_2.pred_txt = "success_or_error: \\result == 0 || \\result == 1"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_mutex_unlock"; + __gen_e_acsl_assert_data_2.line = 316; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_delete_block((void *)(& mutex)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires mutex_valid: \valid(mutex); + ensures + success_or_error: + \result == 0 || \result == 11 || \result == 22 || \result == 35; + assigns *mutex, \result; + assigns *mutex \from *mutex; + assigns \result \from (indirect: *mutex); + */ +int __gen_e_acsl_pthread_mutex_lock(pthread_mutex_t *mutex) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + __e_acsl_store_block((void *)(& mutex),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"mutex", + (void *)mutex); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_mutex_t)",0, + sizeof(pthread_mutex_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)mutex, + sizeof(pthread_mutex_t), + (void *)mutex,(void *)(& mutex)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(mutex)", + 0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "mutex_valid: \\valid(mutex)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_mutex_lock"; + __gen_e_acsl_assert_data.line = 295; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + } + __retres = pthread_mutex_lock(mutex); + { + int __gen_e_acsl_or; + int __gen_e_acsl_or_2; + int __gen_e_acsl_or_3; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or = __retres == 11; + } + if (__gen_e_acsl_or) __gen_e_acsl_or_2 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_2 = __retres == 22; + } + if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_3 = __retres == 35; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Postcondition"; + __gen_e_acsl_assert_data_2.pred_txt = "success_or_error:\n \\result == 0 || \\result == 11 || \\result == 22 || \\result == 35"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_mutex_lock"; + __gen_e_acsl_assert_data_2.line = 299; + __e_acsl_assert(__gen_e_acsl_or_3,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_delete_block((void *)(& mutex)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires mutex_valid: \valid(mutex); + requires attrs_valid_or_null: attrs == \null || \valid_read(attrs); + ensures + initialization: success_or_error: + (\result == 0 && \initialized(\old(mutex))) || \result == 11 || + \result == 12 || \result == 1 || \result == 22; + assigns *mutex, \result; + assigns *mutex \from *mutex, *attrs; + assigns \result \from (indirect: *mutex), (indirect: *attrs); + */ +int __gen_e_acsl_pthread_mutex_init(pthread_mutex_t * restrict mutex, + pthread_mutexattr_t const * restrict attrs) +{ + pthread_mutex_t *__gen_e_acsl_at; + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + int __gen_e_acsl_or; + __e_acsl_store_block((void *)(& attrs),(size_t)8); + __e_acsl_store_block((void *)(& mutex),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"mutex", + (void *)mutex); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_mutex_t)",0, + sizeof(pthread_mutex_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)mutex, + sizeof(pthread_mutex_t), + (void *)mutex,(void *)(& mutex)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(mutex)", + 0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "mutex_valid: \\valid(mutex)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_mutex_init"; + __gen_e_acsl_assert_data.line = 279; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attrs", + (void *)attrs); + if (attrs == (pthread_mutexattr_t const *)0) __gen_e_acsl_or = 1; + else { + int __gen_e_acsl_valid_read; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attrs", + (void *)attrs); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(pthread_mutexattr_t const)",0, + sizeof(pthread_mutexattr_t const)); + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attrs, + sizeof(pthread_mutexattr_t const), + (void *)attrs, + (void *)(& attrs)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "\\valid_read(attrs)",0, + __gen_e_acsl_valid_read); + __gen_e_acsl_or = __gen_e_acsl_valid_read; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Precondition"; + __gen_e_acsl_assert_data_2.pred_txt = "attrs_valid_or_null: attrs == \\null || \\valid_read(attrs)"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_mutex_init"; + __gen_e_acsl_assert_data_2.line = 280; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + } + __gen_e_acsl_at = mutex; + __retres = pthread_mutex_init(mutex,attrs); + { + int __gen_e_acsl_and; + int __gen_e_acsl_or_2; + int __gen_e_acsl_or_3; + int __gen_e_acsl_or_4; + int __gen_e_acsl_or_5; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0, + __retres); + if (__retres == 0) { + int __gen_e_acsl_initialized; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_3, + "\\old(mutex)",(void *)__gen_e_acsl_at); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_3, + "sizeof(pthread_mutex_t)",0, + sizeof(pthread_mutex_t)); + __gen_e_acsl_initialized = __e_acsl_initialized((void *)__gen_e_acsl_at, + sizeof(pthread_mutex_t)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3, + "\\initialized(\\old(mutex))",0, + __gen_e_acsl_initialized); + __gen_e_acsl_and = __gen_e_acsl_initialized; + } + else __gen_e_acsl_and = 0; + if (__gen_e_acsl_and) __gen_e_acsl_or_2 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0, + __retres); + __gen_e_acsl_or_2 = __retres == 11; + } + if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0, + __retres); + __gen_e_acsl_or_3 = __retres == 12; + } + if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0, + __retres); + __gen_e_acsl_or_4 = __retres == 1; + } + if (__gen_e_acsl_or_4) __gen_e_acsl_or_5 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0, + __retres); + __gen_e_acsl_or_5 = __retres == 22; + } + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "Postcondition"; + __gen_e_acsl_assert_data_3.pred_txt = "initialization: success_or_error:\n (\\result == 0 && \\initialized(\\old(mutex))) || \\result == 11 ||\n \\result == 12 || \\result == 1 || \\result == 22"; + __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_3.fct = "pthread_mutex_init"; + __gen_e_acsl_assert_data_3.line = 285; + __e_acsl_assert(__gen_e_acsl_or_5,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + __e_acsl_delete_block((void *)(& attrs)); + __e_acsl_delete_block((void *)(& mutex)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires valid_or_null_retval: retval == \null || \valid(retval); + ensures + success_or_error: + \result == 0 || \result == 35 || \result == 22 || \result == 3; + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + + behavior ignore_retval: + assumes null_retval: retval == \null; + assigns \result; + assigns \result \from (indirect: thread); + + behavior use_retval: + assumes valid_retval: \valid(retval); + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + */ +int __gen_e_acsl_pthread_join(pthread_t thread, void **retval) +{ + __e_acsl_contract_t *__gen_e_acsl_contract; + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_or; + int __gen_e_acsl_valid_2; + __e_acsl_store_block((void *)(& retval),(size_t)8); + __e_acsl_store_block((void *)(& thread),(size_t)4); + __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval", + (void *)retval); + if (retval == (void **)0) __gen_e_acsl_or = 1; + else { + int __gen_e_acsl_valid; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval", + (void *)retval); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(void *)",0,sizeof(void *)); + __gen_e_acsl_valid = __e_acsl_valid((void *)retval,sizeof(void *), + (void *)retval,(void *)(& retval)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid(retval)",0,__gen_e_acsl_valid); + __gen_e_acsl_or = __gen_e_acsl_valid; + } + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_or_null_retval: retval == \\null || \\valid(retval)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_join"; + __gen_e_acsl_assert_data.line = 247; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0, + retval == (void **)0); + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)retval,sizeof(void *), + (void *)retval,(void *)(& retval)); + __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1, + __gen_e_acsl_valid_2); + } + __retres = pthread_join(thread,retval); + { + int __gen_e_acsl_or_2; + int __gen_e_acsl_or_3; + int __gen_e_acsl_or_4; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or_2 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_2 = __retres == 35; + } + if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_3 = __retres == 22; + } + if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_4 = __retres == 3; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Postcondition"; + __gen_e_acsl_assert_data_2.pred_txt = "success_or_error:\n \\result == 0 || \\result == 35 || \\result == 22 || \\result == 3"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_join"; + __gen_e_acsl_assert_data_2.line = 251; + __e_acsl_assert(__gen_e_acsl_or_4,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_contract_clean(__gen_e_acsl_contract); + __e_acsl_delete_block((void *)(& retval)); + __e_acsl_delete_block((void *)(& thread)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires valid_thread: \valid(thread); + requires valid_null_attr: attr == \null || \valid_read(attr); + requires valid_routine: \valid_function(start_routine); + requires valid_null_arg: arg == \null || \valid((char *)arg); + ensures + success_or_error: + \result == 0 || \result == 11 || \result == 22 || \result == 1; + assigns *thread, \result; + assigns *thread \from *attr; + assigns \result \from (indirect: *attr); + */ +int __gen_e_acsl_pthread_create(pthread_t * restrict thread, + pthread_attr_t const * restrict attr, + void *(*start_routine)(void *), + void * restrict arg) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + int __gen_e_acsl_or; + int __gen_e_acsl_or_2; + __e_acsl_store_block((void *)(& arg),(size_t)8); + __e_acsl_store_block((void *)(& start_routine),(size_t)8); + __e_acsl_store_block((void *)(& attr),(size_t)8); + __e_acsl_store_block((void *)(& thread),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"thread", + (void *)thread); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_t)",0,sizeof(pthread_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)thread,sizeof(pthread_t), + (void *)thread,(void *)(& thread)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid(thread)",0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_thread: \\valid(thread)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_create"; + __gen_e_acsl_assert_data.line = 223; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr", + (void *)attr); + if (attr == (pthread_attr_t const *)0) __gen_e_acsl_or = 1; + else { + int __gen_e_acsl_valid_read; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr", + (void *)attr); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(pthread_attr_t const)",0, + sizeof(pthread_attr_t const)); + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attr, + sizeof(pthread_attr_t const), + (void *)attr, + (void *)(& attr)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "\\valid_read(attr)",0, + __gen_e_acsl_valid_read); + __gen_e_acsl_or = __gen_e_acsl_valid_read; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Precondition"; + __gen_e_acsl_assert_data_2.pred_txt = "valid_null_attr: attr == \\null || \\valid_read(attr)"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_create"; + __gen_e_acsl_assert_data_2.line = 224; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg); + if (arg == (void *)0) __gen_e_acsl_or_2 = 1; + else { + int __gen_e_acsl_valid_2; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4, + "sizeof(char)",0,sizeof(char)); + __gen_e_acsl_valid_2 = __e_acsl_valid(arg,sizeof(char),arg, + (void *)(& arg)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, + "\\valid((char *)arg)",0, + __gen_e_acsl_valid_2); + __gen_e_acsl_or_2 = __gen_e_acsl_valid_2; + } + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "Precondition"; + __gen_e_acsl_assert_data_4.pred_txt = "valid_null_arg: arg == \\null || \\valid((char *)arg)"; + __gen_e_acsl_assert_data_4.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_4.fct = "pthread_create"; + __gen_e_acsl_assert_data_4.line = 226; + __e_acsl_assert(__gen_e_acsl_or_2,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + } + __retres = __e_acsl_pthread_create(thread,attr,start_routine,arg); + { + int __gen_e_acsl_or_3; + int __gen_e_acsl_or_4; + int __gen_e_acsl_or_5; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or_3 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + __gen_e_acsl_or_3 = __retres == 11; + } + if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + __gen_e_acsl_or_4 = __retres == 22; + } + if (__gen_e_acsl_or_4) __gen_e_acsl_or_5 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + __gen_e_acsl_or_5 = __retres == 1; + } + __gen_e_acsl_assert_data_5.blocking = 1; + __gen_e_acsl_assert_data_5.kind = "Postcondition"; + __gen_e_acsl_assert_data_5.pred_txt = "success_or_error:\n \\result == 0 || \\result == 11 || \\result == 22 || \\result == 1"; + __gen_e_acsl_assert_data_5.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_5.fct = "pthread_create"; + __gen_e_acsl_assert_data_5.line = 230; + __e_acsl_assert(__gen_e_acsl_or_5,& __gen_e_acsl_assert_data_5); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5); + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& start_routine)); + __e_acsl_delete_block((void *)(& attr)); + __e_acsl_delete_block((void *)(& thread)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires valid_cond: \valid(cond); + requires valid_mutex: \valid(mutex); + ensures success: \result == 0; + assigns \result; + assigns \result \from \nothing; + */ +int __gen_e_acsl_pthread_cond_wait(pthread_cond_t * restrict cond, + pthread_mutex_t * restrict mutex) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + int __gen_e_acsl_valid_2; + __e_acsl_store_block((void *)(& mutex),(size_t)8); + __e_acsl_store_block((void *)(& cond),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"cond", + (void *)cond); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_cond_t)",0, + sizeof(pthread_cond_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)cond,sizeof(pthread_cond_t), + (void *)cond,(void *)(& cond)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(cond)", + 0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_cond: \\valid(cond)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_cond_wait"; + __gen_e_acsl_assert_data.line = 203; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"mutex", + (void *)mutex); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(pthread_mutex_t)",0, + sizeof(pthread_mutex_t)); + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)mutex, + sizeof(pthread_mutex_t), + (void *)mutex,(void *)(& mutex)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "\\valid(mutex)",0,__gen_e_acsl_valid_2); + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Precondition"; + __gen_e_acsl_assert_data_2.pred_txt = "valid_mutex: \\valid(mutex)"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_cond_wait"; + __gen_e_acsl_assert_data_2.line = 204; + __e_acsl_assert(__gen_e_acsl_valid_2,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + } + __retres = pthread_cond_wait(cond,mutex); + { + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"\\result",0, + __retres); + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "Postcondition"; + __gen_e_acsl_assert_data_3.pred_txt = "success: \\result == 0"; + __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_3.fct = "pthread_cond_wait"; + __gen_e_acsl_assert_data_3.line = 206; + __e_acsl_assert(__retres == 0,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + __e_acsl_delete_block((void *)(& mutex)); + __e_acsl_delete_block((void *)(& cond)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires valid_cond: \valid(cond); + requires valid_null_attr: attr == \null || \valid_read(attr); + ensures initialization: cond: \initialized(\old(cond)); + ensures success: \result == 0; + assigns *cond, \result; + assigns *cond \from *attr; + assigns \result \from \nothing; + */ +int __gen_e_acsl_pthread_cond_init(pthread_cond_t * restrict cond, + pthread_condattr_t const * restrict attr) +{ + pthread_cond_t *__gen_e_acsl_at; + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + int __gen_e_acsl_or; + __e_acsl_store_block((void *)(& attr),(size_t)8); + __e_acsl_store_block((void *)(& cond),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"cond", + (void *)cond); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_cond_t)",0, + sizeof(pthread_cond_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)cond,sizeof(pthread_cond_t), + (void *)cond,(void *)(& cond)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(cond)", + 0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_cond: \\valid(cond)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_cond_init"; + __gen_e_acsl_assert_data.line = 187; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr", + (void *)attr); + if (attr == (pthread_condattr_t const *)0) __gen_e_acsl_or = 1; + else { + int __gen_e_acsl_valid_read; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr", + (void *)attr); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(pthread_condattr_t const)",0, + sizeof(pthread_condattr_t const)); + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attr, + sizeof(pthread_condattr_t const), + (void *)attr, + (void *)(& attr)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "\\valid_read(attr)",0, + __gen_e_acsl_valid_read); + __gen_e_acsl_or = __gen_e_acsl_valid_read; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Precondition"; + __gen_e_acsl_assert_data_2.pred_txt = "valid_null_attr: attr == \\null || \\valid_read(attr)"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_cond_init"; + __gen_e_acsl_assert_data_2.line = 188; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + } + __gen_e_acsl_at = cond; + __retres = pthread_cond_init(cond,attr); + { + int __gen_e_acsl_initialized; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_3,"\\old(cond)", + (void *)__gen_e_acsl_at); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_3, + "sizeof(pthread_cond_t)",0, + sizeof(pthread_cond_t)); + __gen_e_acsl_initialized = __e_acsl_initialized((void *)__gen_e_acsl_at, + sizeof(pthread_cond_t)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3, + "initialization: cond: \\initialized(\\old(cond))", + 0,__gen_e_acsl_initialized); + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "Postcondition"; + __gen_e_acsl_assert_data_3.pred_txt = "initialization: cond: \\initialized(\\old(cond))"; + __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_3.fct = "pthread_cond_init"; + __gen_e_acsl_assert_data_3.line = 191; + __e_acsl_assert(__gen_e_acsl_initialized,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4,"\\result",0, + __retres); + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "Postcondition"; + __gen_e_acsl_assert_data_4.pred_txt = "success: \\result == 0"; + __gen_e_acsl_assert_data_4.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_4.fct = "pthread_cond_init"; + __gen_e_acsl_assert_data_4.line = 192; + __e_acsl_assert(__retres == 0,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + __e_acsl_delete_block((void *)(& attr)); + __e_acsl_delete_block((void *)(& cond)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires valid_cond: \valid(cond); + ensures sucess: \result == 0; + assigns \result; + assigns \result \from \nothing; + */ +int __gen_e_acsl_pthread_cond_broadcast(pthread_cond_t *cond) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + __e_acsl_store_block((void *)(& cond),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"cond", + (void *)cond); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_cond_t)",0, + sizeof(pthread_cond_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)cond,sizeof(pthread_cond_t), + (void *)cond,(void *)(& cond)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"\\valid(cond)", + 0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_cond: \\valid(cond)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_cond_broadcast"; + __gen_e_acsl_assert_data.line = 173; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + } + __retres = pthread_cond_broadcast(cond); + { + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Postcondition"; + __gen_e_acsl_assert_data_2.pred_txt = "sucess: \\result == 0"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_cond_broadcast"; + __gen_e_acsl_assert_data_2.line = 175; + __e_acsl_assert(__retres == 0,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_delete_block((void *)(& cond)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +void __e_acsl_globals_init(void) +{ + static char __e_acsl_already_run = 0; + if (! __e_acsl_already_run) { + __e_acsl_already_run = 1; + __gen_e_acsl_literal_string_2 = "Unable to wait on condvar in write_value()"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_2, + sizeof("Unable to wait on condvar in write_value()")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_2); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_2); + __gen_e_acsl_literal_string_5 = "Unable to wait on condvar in read_value()"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_5, + sizeof("Unable to wait on condvar in read_value()")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_5); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_5); + __gen_e_acsl_literal_string_3 = "Unable to unlock mutex in write_value()"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_3, + sizeof("Unable to unlock mutex in write_value()")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_3); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_3); + __gen_e_acsl_literal_string_6 = "Unable to unlock mutex in read_value()"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_6, + sizeof("Unable to unlock mutex in read_value()")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_6); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_6); + __gen_e_acsl_literal_string_11 = "Unable to lock write_mutex"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_11, + sizeof("Unable to lock write_mutex")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_11); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_11); + __gen_e_acsl_literal_string_12 = "Unable to lock read_mutex"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_12, + sizeof("Unable to lock read_mutex")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_12); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_12); + __gen_e_acsl_literal_string = "Unable to lock mutex in write_value()"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string, + sizeof("Unable to lock mutex in write_value()")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string); + __gen_e_acsl_literal_string_4 = "Unable to lock mutex in read_value()"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_4, + sizeof("Unable to lock mutex in read_value()")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_4); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_4); + __gen_e_acsl_literal_string_7 = "Unable to initialize write mutex"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_7, + sizeof("Unable to initialize write mutex")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_7); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_7); + __gen_e_acsl_literal_string_8 = "Unable to initialize write cond var"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_8, + sizeof("Unable to initialize write cond var")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_8); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_8); + __gen_e_acsl_literal_string_9 = "Unable to initialize read mutex"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_9, + sizeof("Unable to initialize read mutex")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_9); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_9); + __gen_e_acsl_literal_string_10 = "Unable to initialize read cond var"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_10, + sizeof("Unable to initialize read cond var")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_10); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_10); + __gen_e_acsl_literal_string_13 = "Unable to broadcast to write cond var"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_13, + sizeof("Unable to broadcast to write cond var")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_13); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_13); + __gen_e_acsl_literal_string_14 = "Unable to broadcast to read cond var"; + __e_acsl_store_block((void *)__gen_e_acsl_literal_string_14, + sizeof("Unable to broadcast to read cond var")); + __e_acsl_full_init((void *)__gen_e_acsl_literal_string_14); + __e_acsl_mark_readonly((void *)__gen_e_acsl_literal_string_14); + __e_acsl_store_block((void *)(& __gen_e_acsl_read_value),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_read_value)); + __e_acsl_store_block((void *)(& __gen_e_acsl_write_value),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_write_value)); + __e_acsl_store_block((void *)(& __gen_e_acsl_usleep),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_usleep)); + __e_acsl_store_block((void *)(& __gen_e_acsl_exit),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_exit)); + __e_acsl_store_block((void *)(& __gen_e_acsl_perror),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_perror)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_mutex_unlock), + (size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_mutex_unlock)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_mutex_lock), + (size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_mutex_lock)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_mutex_init), + (size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_mutex_init)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_join),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_join)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_create),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_create)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_cond_wait), + (size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_cond_wait)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_cond_init), + (size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_cond_init)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_cond_broadcast), + (size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_cond_broadcast)); + __e_acsl_store_block((void *)(& read_value),(size_t)1); + __e_acsl_full_init((void *)(& read_value)); + __e_acsl_store_block((void *)(& write_value),(size_t)1); + __e_acsl_full_init((void *)(& write_value)); + __e_acsl_store_block((void *)(& read_mutex),(size_t)4); + __e_acsl_full_init((void *)(& read_mutex)); + __e_acsl_store_block((void *)(& write_mutex),(size_t)4); + __e_acsl_full_init((void *)(& write_mutex)); + __e_acsl_store_block((void *)(& read_cond),(size_t)4); + __e_acsl_full_init((void *)(& read_cond)); + __e_acsl_store_block((void *)(& write_cond),(size_t)4); + __e_acsl_full_init((void *)(& write_cond)); + __e_acsl_store_block((void *)(& read_count),(size_t)4); + __e_acsl_full_init((void *)(& read_count)); + __e_acsl_store_block((void *)(& write_count),(size_t)4); + __e_acsl_full_init((void *)(& write_count)); + __e_acsl_store_block((void *)(values),(size_t)80); + __e_acsl_full_init((void *)(& values)); + __e_acsl_store_block((void *)(& usleep),(size_t)1); + __e_acsl_full_init((void *)(& usleep)); + __e_acsl_store_block((void *)(& __fc_p_ttyname),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_ttyname)); + __e_acsl_store_block((void *)(ttyname),(size_t)32); + __e_acsl_full_init((void *)(& ttyname)); + __e_acsl_store_block((void *)(& Frama_C_entropy_source),(size_t)4); + __e_acsl_full_init((void *)(& Frama_C_entropy_source)); + __e_acsl_store_block((void *)(& exit),(size_t)1); + __e_acsl_full_init((void *)(& exit)); + __e_acsl_store_block((void *)(& free),(size_t)1); + __e_acsl_full_init((void *)(& free)); + __e_acsl_store_block((void *)(& malloc),(size_t)1); + __e_acsl_full_init((void *)(& malloc)); + __e_acsl_store_block((void *)(& __fc_p_random48_counter),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_random48_counter)); + __e_acsl_store_block((void *)(random48_counter),(size_t)6); + __e_acsl_full_init((void *)(& random48_counter)); + __e_acsl_store_block((void *)(& __fc_random48_init),(size_t)4); + __e_acsl_full_init((void *)(& __fc_random48_init)); + __e_acsl_store_block((void *)(& __fc_rand_max),(size_t)8); + __e_acsl_full_init((void *)(& __fc_rand_max)); + __e_acsl_store_block((void *)(& perror),(size_t)1); + __e_acsl_full_init((void *)(& perror)); + __e_acsl_store_block((void *)(& __fc_p_tmpnam),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_tmpnam)); + __e_acsl_store_block((void *)(__fc_tmpnam),(size_t)2048); + __e_acsl_full_init((void *)(& __fc_tmpnam)); + __e_acsl_store_block((void *)(& __fc_p_fopen),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_fopen)); + __e_acsl_store_block((void *)(__fc_fopen),(size_t)128); + __e_acsl_full_init((void *)(& __fc_fopen)); + __e_acsl_store_block((void *)(& stdout),(size_t)8); + __e_acsl_full_init((void *)(& stdout)); + __e_acsl_store_block((void *)(& stdin),(size_t)8); + __e_acsl_full_init((void *)(& stdin)); + __e_acsl_store_block((void *)(& __fc_interrupted),(size_t)4); + __e_acsl_full_init((void *)(& __fc_interrupted)); + __e_acsl_store_block((void *)(& __fc_p_time_tm),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_time_tm)); + __e_acsl_store_block((void *)(& __fc_time_tm),(size_t)36); + __e_acsl_full_init((void *)(& __fc_time_tm)); + __e_acsl_store_block((void *)(& __fc_p_ctime),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_ctime)); + __e_acsl_store_block((void *)(__fc_ctime),(size_t)26); + __e_acsl_full_init((void *)(& __fc_ctime)); + __e_acsl_store_block((void *)(& __fc_time),(size_t)4); + __e_acsl_full_init((void *)(& __fc_time)); + __e_acsl_store_block((void *)(& __fc_p_sigaction),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_sigaction)); + __e_acsl_store_block((void *)(sigaction),(size_t)2080); + __e_acsl_full_init((void *)(& sigaction)); + __e_acsl_store_block((void *)(& pthread_mutex_unlock),(size_t)1); + __e_acsl_full_init((void *)(& pthread_mutex_unlock)); + __e_acsl_store_block((void *)(& pthread_mutex_trylock),(size_t)1); + __e_acsl_full_init((void *)(& pthread_mutex_trylock)); + __e_acsl_store_block((void *)(& pthread_mutex_lock),(size_t)1); + __e_acsl_full_init((void *)(& pthread_mutex_lock)); + __e_acsl_store_block((void *)(& pthread_mutex_init),(size_t)1); + __e_acsl_full_init((void *)(& pthread_mutex_init)); + __e_acsl_store_block((void *)(& pthread_join),(size_t)1); + __e_acsl_full_init((void *)(& pthread_join)); + __e_acsl_store_block((void *)(& pthread_create),(size_t)1); + __e_acsl_full_init((void *)(& pthread_create)); + __e_acsl_store_block((void *)(& pthread_cond_wait),(size_t)1); + __e_acsl_full_init((void *)(& pthread_cond_wait)); + __e_acsl_store_block((void *)(& pthread_cond_init),(size_t)1); + __e_acsl_full_init((void *)(& pthread_cond_init)); + __e_acsl_store_block((void *)(& pthread_cond_broadcast),(size_t)1); + __e_acsl_full_init((void *)(& pthread_cond_broadcast)); + __e_acsl_store_block((void *)(& errno),(size_t)4); + __e_acsl_full_init((void *)(& errno)); + } + return; +} + +void __e_acsl_globals_clean(void) +{ + __e_acsl_delete_block((void *)(& __gen_e_acsl_read_value)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_write_value)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_usleep)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_exit)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_perror)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_mutex_unlock)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_mutex_lock)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_mutex_init)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_join)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_create)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_cond_wait)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_cond_init)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_cond_broadcast)); + __e_acsl_delete_block((void *)(& read_value)); + __e_acsl_delete_block((void *)(& write_value)); + __e_acsl_delete_block((void *)(& read_mutex)); + __e_acsl_delete_block((void *)(& write_mutex)); + __e_acsl_delete_block((void *)(& read_cond)); + __e_acsl_delete_block((void *)(& write_cond)); + __e_acsl_delete_block((void *)(& read_count)); + __e_acsl_delete_block((void *)(& write_count)); + __e_acsl_delete_block((void *)(values)); + __e_acsl_delete_block((void *)(& usleep)); + __e_acsl_delete_block((void *)(& __fc_p_ttyname)); + __e_acsl_delete_block((void *)(ttyname)); + __e_acsl_delete_block((void *)(& Frama_C_entropy_source)); + __e_acsl_delete_block((void *)(& exit)); + __e_acsl_delete_block((void *)(& free)); + __e_acsl_delete_block((void *)(& malloc)); + __e_acsl_delete_block((void *)(& __fc_p_random48_counter)); + __e_acsl_delete_block((void *)(random48_counter)); + __e_acsl_delete_block((void *)(& __fc_random48_init)); + __e_acsl_delete_block((void *)(& __fc_rand_max)); + __e_acsl_delete_block((void *)(& perror)); + __e_acsl_delete_block((void *)(& __fc_p_tmpnam)); + __e_acsl_delete_block((void *)(__fc_tmpnam)); + __e_acsl_delete_block((void *)(& __fc_p_fopen)); + __e_acsl_delete_block((void *)(__fc_fopen)); + __e_acsl_delete_block((void *)(& stdout)); + __e_acsl_delete_block((void *)(& stdin)); + __e_acsl_delete_block((void *)(& __fc_interrupted)); + __e_acsl_delete_block((void *)(& __fc_p_time_tm)); + __e_acsl_delete_block((void *)(& __fc_time_tm)); + __e_acsl_delete_block((void *)(& __fc_p_ctime)); + __e_acsl_delete_block((void *)(__fc_ctime)); + __e_acsl_delete_block((void *)(& __fc_time)); + __e_acsl_delete_block((void *)(& __fc_p_sigaction)); + __e_acsl_delete_block((void *)(sigaction)); + __e_acsl_delete_block((void *)(& pthread_mutex_unlock)); + __e_acsl_delete_block((void *)(& pthread_mutex_trylock)); + __e_acsl_delete_block((void *)(& pthread_mutex_lock)); + __e_acsl_delete_block((void *)(& pthread_mutex_init)); + __e_acsl_delete_block((void *)(& pthread_join)); + __e_acsl_delete_block((void *)(& pthread_create)); + __e_acsl_delete_block((void *)(& pthread_cond_wait)); + __e_acsl_delete_block((void *)(& pthread_cond_init)); + __e_acsl_delete_block((void *)(& pthread_cond_broadcast)); + __e_acsl_delete_block((void *)(& errno)); + return; +} + +int main(void) +{ + int __retres; + pthread_t writers[10]; + pthread_t readers[10]; + int args[10]; + int tmp; + int tmp_0; + int tmp_1; + int tmp_2; + int tmp_5; + int tmp_6; + __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8); + __e_acsl_globals_init(); + __e_acsl_store_block((void *)(& tmp_6),(size_t)4); + __e_acsl_store_block((void *)(& tmp_5),(size_t)4); + __e_acsl_store_block((void *)(& tmp_2),(size_t)4); + __e_acsl_store_block((void *)(& tmp_1),(size_t)4); + __e_acsl_store_block((void *)(& tmp_0),(size_t)4); + __e_acsl_store_block((void *)(& tmp),(size_t)4); + __e_acsl_store_block((void *)(args),(size_t)40); + __e_acsl_store_block((void *)(readers),(size_t)40); + __e_acsl_store_block((void *)(writers),(size_t)40); + __e_acsl_store_block((void *)(& __retres),(size_t)4); + __e_acsl_full_init((void *)(& tmp)); + tmp = __gen_e_acsl_pthread_mutex_init(& write_mutex, + (pthread_mutexattr_t const *)0); + if (tmp != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_7); + __gen_e_acsl_exit(1); + } + __e_acsl_full_init((void *)(& tmp_0)); + tmp_0 = __gen_e_acsl_pthread_cond_init(& write_cond, + (pthread_condattr_t const *)0); + if (tmp_0 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_8); + __gen_e_acsl_exit(1); + } + __e_acsl_full_init((void *)(& tmp_1)); + tmp_1 = __gen_e_acsl_pthread_mutex_init(& read_mutex, + (pthread_mutexattr_t const *)0); + if (tmp_1 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_9); + __gen_e_acsl_exit(1); + } + __e_acsl_full_init((void *)(& tmp_2)); + tmp_2 = __gen_e_acsl_pthread_cond_init(& read_cond, + (pthread_condattr_t const *)0); + if (tmp_2 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_10); + __gen_e_acsl_exit(1); + } + { + int i = 0; + __e_acsl_store_block((void *)(& i),(size_t)4); + __e_acsl_full_init((void *)(& i)); + while (i < 10) { + __e_acsl_initialize((void *)(& args[i]),sizeof(int)); + args[i] = i; + __gen_e_acsl_pthread_create(& writers[i],(pthread_attr_t const *)0, + & __gen_e_acsl_write_value, + (void *)(& args[i])); + __gen_e_acsl_pthread_create(& readers[i],(pthread_attr_t const *)0, + & __gen_e_acsl_read_value, + (void *)(& args[i])); + __e_acsl_full_init((void *)(& i)); + i ++; + } + __e_acsl_delete_block((void *)(& i)); + } + while (1) { + int res = pthread_mutex_trylock(& write_mutex); + __e_acsl_store_block((void *)(& res),(size_t)4); + __e_acsl_full_init((void *)(& res)); + if (res == 0) { + int done = write_count == 10; + __e_acsl_store_block((void *)(& done),(size_t)4); + __e_acsl_full_init((void *)(& done)); + __gen_e_acsl_pthread_mutex_unlock(& write_mutex); + if (done) { + __e_acsl_delete_block((void *)(& res)); + __e_acsl_delete_block((void *)(& done)); + break; + } + __e_acsl_delete_block((void *)(& done)); + } + else + if (res != 16) __gen_e_acsl_perror(__gen_e_acsl_literal_string_11); + __gen_e_acsl_usleep((unsigned int)100); + __e_acsl_delete_block((void *)(& res)); + } + while (1) { + int res_0 = pthread_mutex_trylock(& read_mutex); + __e_acsl_store_block((void *)(& res_0),(size_t)4); + __e_acsl_full_init((void *)(& res_0)); + if (res_0 == 0) { + int done_0 = read_count == 10; + __e_acsl_store_block((void *)(& done_0),(size_t)4); + __e_acsl_full_init((void *)(& done_0)); + __gen_e_acsl_pthread_mutex_unlock(& read_mutex); + if (done_0) { + __e_acsl_delete_block((void *)(& res_0)); + __e_acsl_delete_block((void *)(& done_0)); + break; + } + __e_acsl_delete_block((void *)(& done_0)); + } + else + if (res_0 != 16) __gen_e_acsl_perror(__gen_e_acsl_literal_string_12); + __gen_e_acsl_usleep((unsigned int)100); + __e_acsl_delete_block((void *)(& res_0)); + } + __e_acsl_full_init((void *)(& tmp_5)); + tmp_5 = __gen_e_acsl_pthread_cond_broadcast(& write_cond); + if (tmp_5 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_13); + __gen_e_acsl_exit(11); + } + { + int i_0 = 0; + __e_acsl_store_block((void *)(& i_0),(size_t)4); + __e_acsl_full_init((void *)(& i_0)); + while (i_0 < 10) { + __gen_e_acsl_pthread_join(writers[i_0],(void **)0); + __e_acsl_full_init((void *)(& i_0)); + i_0 ++; + } + __e_acsl_delete_block((void *)(& i_0)); + } + __e_acsl_full_init((void *)(& tmp_6)); + tmp_6 = __gen_e_acsl_pthread_cond_broadcast(& read_cond); + if (tmp_6 != 0) { + __gen_e_acsl_perror(__gen_e_acsl_literal_string_14); + __gen_e_acsl_exit(12); + } + { + int i_1 = 0; + __e_acsl_store_block((void *)(& i_1),(size_t)4); + __e_acsl_full_init((void *)(& i_1)); + while (i_1 < 10) { + __gen_e_acsl_pthread_join(readers[i_1],(void **)0); + __e_acsl_full_init((void *)(& i_1)); + i_1 ++; + } + __e_acsl_delete_block((void *)(& i_1)); + } + __e_acsl_full_init((void *)(& __retres)); + __retres = 0; + __e_acsl_delete_block((void *)(& tmp_6)); + __e_acsl_delete_block((void *)(& tmp_5)); + __e_acsl_delete_block((void *)(& tmp_2)); + __e_acsl_delete_block((void *)(& tmp_1)); + __e_acsl_delete_block((void *)(& tmp_0)); + __e_acsl_delete_block((void *)(& tmp)); + __e_acsl_delete_block((void *)(args)); + __e_acsl_delete_block((void *)(readers)); + __e_acsl_delete_block((void *)(writers)); + __e_acsl_delete_block((void *)(& __retres)); + __e_acsl_globals_clean(); + __e_acsl_memory_clean(); + return __retres; +} + + diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_safe_locations.c b/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_safe_locations.c new file mode 100644 index 0000000000000000000000000000000000000000..504891d5736895c459fd6a7e1efec8baafee5109 --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_safe_locations.c @@ -0,0 +1,573 @@ +/* Generated by Frama-C */ +#include "errno.h" +#include "pthread.h" +#include "sched.h" +#include "signal.h" +#include "stddef.h" +#include "stdint.h" +#include "stdio.h" +#include "time.h" +extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; + +/*@ requires valid_thread: \valid(thread); + requires valid_null_attr: attr == \null || \valid_read(attr); + requires valid_routine: \valid_function(start_routine); + requires valid_null_arg: arg == \null || \valid((char *)arg); + ensures + success_or_error: + \result == 0 || \result == 11 || \result == 22 || \result == 1; + assigns *thread, \result; + assigns *thread \from *attr; + assigns \result \from (indirect: *attr); + */ +int __gen_e_acsl_pthread_create(pthread_t * restrict thread, + pthread_attr_t const * restrict attr, + void *(*start_routine)(void *), + void * restrict arg); + +/*@ requires valid_or_null_retval: retval == \null || \valid(retval); + ensures + success_or_error: + \result == 0 || \result == 35 || \result == 22 || \result == 3; + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + + behavior ignore_retval: + assumes null_retval: retval == \null; + assigns \result; + assigns \result \from (indirect: thread); + + behavior use_retval: + assumes valid_retval: \valid(retval); + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + */ +int __gen_e_acsl_pthread_join(pthread_t thread, void **retval); + +void *thread_start(void *arg) +{ + void *__retres; + __e_acsl_store_block((void *)(& __retres),(size_t)8); + { + int __gen_e_acsl_valid; + int __gen_e_acsl_and; + __e_acsl_store_block((void *)(& arg),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"__fc_stdout", + (void *)stdout); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,"sizeof(FILE)", + 0,sizeof(FILE)); + __gen_e_acsl_valid = __e_acsl_valid((void *)stdout,sizeof(FILE), + (void *)stdout,(void *)(& stdout)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid(__fc_stdout)",0,__gen_e_acsl_valid); + if (__gen_e_acsl_valid) { + int __gen_e_acsl_initialized; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"__fc_stdout", + (void *)stdout); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(FILE)",0,sizeof(FILE)); + __gen_e_acsl_initialized = __e_acsl_initialized((void *)stdout, + sizeof(FILE)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\initialized(__fc_stdout)",0, + __gen_e_acsl_initialized); + __gen_e_acsl_and = __gen_e_acsl_initialized; + } + else __gen_e_acsl_and = 0; + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Assertion"; + __gen_e_acsl_assert_data.pred_txt = "\\valid(__fc_stdout) && \\initialized(__fc_stdout)"; + __gen_e_acsl_assert_data.file = "threads_safe_locations.c"; + __gen_e_acsl_assert_data.fct = "thread_start"; + __gen_e_acsl_assert_data.line = 6; + __e_acsl_assert(__gen_e_acsl_and,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + } + /*@ assert \valid(__fc_stdout) && \initialized(__fc_stdout); */ ; + { + int __gen_e_acsl_valid_2; + int __gen_e_acsl_and_2; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"__fc_stderr", + (void *)stderr); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(FILE)",0,sizeof(FILE)); + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)stderr,sizeof(FILE), + (void *)stderr,(void *)(& stderr)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "\\valid(__fc_stderr)",0, + __gen_e_acsl_valid_2); + if (__gen_e_acsl_valid_2) { + int __gen_e_acsl_initialized_2; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2, + "__fc_stderr",(void *)stderr); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(FILE)",0,sizeof(FILE)); + __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)stderr, + sizeof(FILE)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "\\initialized(__fc_stderr)",0, + __gen_e_acsl_initialized_2); + __gen_e_acsl_and_2 = __gen_e_acsl_initialized_2; + } + else __gen_e_acsl_and_2 = 0; + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Assertion"; + __gen_e_acsl_assert_data_2.pred_txt = "\\valid(__fc_stderr) && \\initialized(__fc_stderr)"; + __gen_e_acsl_assert_data_2.file = "threads_safe_locations.c"; + __gen_e_acsl_assert_data_2.fct = "thread_start"; + __gen_e_acsl_assert_data_2.line = 7; + __e_acsl_assert(__gen_e_acsl_and_2,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + } + /*@ assert \valid(__fc_stderr) && \initialized(__fc_stderr); */ ; + { + int __gen_e_acsl_valid_3; + int __gen_e_acsl_and_3; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_3,"__fc_stdin", + (void *)stdin); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_3, + "sizeof(FILE)",0,sizeof(FILE)); + __gen_e_acsl_valid_3 = __e_acsl_valid((void *)stdin,sizeof(FILE), + (void *)stdin,(void *)(& stdin)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3, + "\\valid(__fc_stdin)",0, + __gen_e_acsl_valid_3); + if (__gen_e_acsl_valid_3) { + int __gen_e_acsl_initialized_3; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_3,"__fc_stdin", + (void *)stdin); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_3, + "sizeof(FILE)",0,sizeof(FILE)); + __gen_e_acsl_initialized_3 = __e_acsl_initialized((void *)stdin, + sizeof(FILE)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3, + "\\initialized(__fc_stdin)",0, + __gen_e_acsl_initialized_3); + __gen_e_acsl_and_3 = __gen_e_acsl_initialized_3; + } + else __gen_e_acsl_and_3 = 0; + __gen_e_acsl_assert_data_3.blocking = 1; + __gen_e_acsl_assert_data_3.kind = "Assertion"; + __gen_e_acsl_assert_data_3.pred_txt = "\\valid(__fc_stdin) && \\initialized(__fc_stdin)"; + __gen_e_acsl_assert_data_3.file = "threads_safe_locations.c"; + __gen_e_acsl_assert_data_3.fct = "thread_start"; + __gen_e_acsl_assert_data_3.line = 8; + __e_acsl_assert(__gen_e_acsl_and_3,& __gen_e_acsl_assert_data_3); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); + } + /*@ assert \valid(__fc_stdin) && \initialized(__fc_stdin); */ ; + int *addrof_errno = & errno; + __e_acsl_store_block((void *)(& addrof_errno),(size_t)8); + __e_acsl_full_init((void *)(& addrof_errno)); + { + int __gen_e_acsl_initialized_4; + int __gen_e_acsl_and_4; + int __gen_e_acsl_and_5; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4, + "&addrof_errno",(void *)(& addrof_errno)); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4, + "sizeof(int *)",0,sizeof(int *)); + __gen_e_acsl_initialized_4 = __e_acsl_initialized((void *)(& addrof_errno), + sizeof(int *)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, + "\\initialized(&addrof_errno)",0, + __gen_e_acsl_initialized_4); + if (__gen_e_acsl_initialized_4) { + int __gen_e_acsl_valid_4; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4, + "addrof_errno",(void *)addrof_errno); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_valid_4 = __e_acsl_valid((void *)addrof_errno,sizeof(int), + (void *)addrof_errno, + (void *)(& addrof_errno)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, + "\\valid(addrof_errno)",0, + __gen_e_acsl_valid_4); + __gen_e_acsl_and_4 = __gen_e_acsl_valid_4; + } + else __gen_e_acsl_and_4 = 0; + if (__gen_e_acsl_and_4) { + int __gen_e_acsl_initialized_5; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4, + "addrof_errno",(void *)addrof_errno); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4, + "sizeof(int)",0,sizeof(int)); + __gen_e_acsl_initialized_5 = __e_acsl_initialized((void *)addrof_errno, + sizeof(int)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, + "\\initialized(addrof_errno)",0, + __gen_e_acsl_initialized_5); + __gen_e_acsl_and_5 = __gen_e_acsl_initialized_5; + } + else __gen_e_acsl_and_5 = 0; + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "Assertion"; + __gen_e_acsl_assert_data_4.pred_txt = "\\valid(addrof_errno) && \\initialized(addrof_errno)"; + __gen_e_acsl_assert_data_4.file = "threads_safe_locations.c"; + __gen_e_acsl_assert_data_4.fct = "thread_start"; + __gen_e_acsl_assert_data_4.line = 10; + __e_acsl_assert(__gen_e_acsl_and_5,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + } + /*@ assert \valid(addrof_errno) && \initialized(addrof_errno); */ ; + __e_acsl_full_init((void *)(& __retres)); + __retres = (void *)0; + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& addrof_errno)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; +} + +/*@ requires valid_or_null_retval: retval == \null || \valid(retval); + ensures + success_or_error: + \result == 0 || \result == 35 || \result == 22 || \result == 3; + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + + behavior ignore_retval: + assumes null_retval: retval == \null; + assigns \result; + assigns \result \from (indirect: thread); + + behavior use_retval: + assumes valid_retval: \valid(retval); + assigns *retval, \result; + assigns *retval \from thread; + assigns \result \from (indirect: thread); + */ +int __gen_e_acsl_pthread_join(pthread_t thread, void **retval) +{ + __e_acsl_contract_t *__gen_e_acsl_contract; + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_or; + int __gen_e_acsl_valid_2; + __e_acsl_store_block((void *)(& retval),(size_t)8); + __e_acsl_store_block((void *)(& thread),(size_t)4); + __gen_e_acsl_contract = __e_acsl_contract_init((size_t)2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval", + (void *)retval); + if (retval == (void **)0) __gen_e_acsl_or = 1; + else { + int __gen_e_acsl_valid; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"retval", + (void *)retval); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(void *)",0,sizeof(void *)); + __gen_e_acsl_valid = __e_acsl_valid((void *)retval,sizeof(void *), + (void *)retval,(void *)(& retval)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid(retval)",0,__gen_e_acsl_valid); + __gen_e_acsl_or = __gen_e_acsl_valid; + } + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_or_null_retval: retval == \\null || \\valid(retval)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_join"; + __gen_e_acsl_assert_data.line = 247; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0, + retval == (void **)0); + __gen_e_acsl_valid_2 = __e_acsl_valid((void *)retval,sizeof(void *), + (void *)retval,(void *)(& retval)); + __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)1, + __gen_e_acsl_valid_2); + } + __retres = pthread_join(thread,retval); + { + int __gen_e_acsl_or_2; + int __gen_e_acsl_or_3; + int __gen_e_acsl_or_4; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or_2 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_2 = __retres == 35; + } + if (__gen_e_acsl_or_2) __gen_e_acsl_or_3 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_3 = __retres == 22; + } + if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or_4 = __retres == 3; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Postcondition"; + __gen_e_acsl_assert_data_2.pred_txt = "success_or_error:\n \\result == 0 || \\result == 35 || \\result == 22 || \\result == 3"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_join"; + __gen_e_acsl_assert_data_2.line = 251; + __e_acsl_assert(__gen_e_acsl_or_4,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_contract_clean(__gen_e_acsl_contract); + __e_acsl_delete_block((void *)(& retval)); + __e_acsl_delete_block((void *)(& thread)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +/*@ requires valid_thread: \valid(thread); + requires valid_null_attr: attr == \null || \valid_read(attr); + requires valid_routine: \valid_function(start_routine); + requires valid_null_arg: arg == \null || \valid((char *)arg); + ensures + success_or_error: + \result == 0 || \result == 11 || \result == 22 || \result == 1; + assigns *thread, \result; + assigns *thread \from *attr; + assigns \result \from (indirect: *attr); + */ +int __gen_e_acsl_pthread_create(pthread_t * restrict thread, + pthread_attr_t const * restrict attr, + void *(*start_routine)(void *), + void * restrict arg) +{ + int __retres; + __e_acsl_store_block((void *)(& __retres),(size_t)4); + { + int __gen_e_acsl_valid; + int __gen_e_acsl_or; + int __gen_e_acsl_or_2; + __e_acsl_store_block((void *)(& arg),(size_t)8); + __e_acsl_store_block((void *)(& start_routine),(size_t)8); + __e_acsl_store_block((void *)(& attr),(size_t)8); + __e_acsl_store_block((void *)(& thread),(size_t)8); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"thread", + (void *)thread); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data, + "sizeof(pthread_t)",0,sizeof(pthread_t)); + __gen_e_acsl_valid = __e_acsl_valid((void *)thread,sizeof(pthread_t), + (void *)thread,(void *)(& thread)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid(thread)",0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "valid_thread: \\valid(thread)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data.fct = "pthread_create"; + __gen_e_acsl_assert_data.line = 223; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr", + (void *)attr); + if (attr == (pthread_attr_t const *)0) __gen_e_acsl_or = 1; + else { + int __gen_e_acsl_valid_read; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_2,"attr", + (void *)attr); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_2, + "sizeof(pthread_attr_t const)",0, + sizeof(pthread_attr_t const)); + __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)attr, + sizeof(pthread_attr_t const), + (void *)attr, + (void *)(& attr)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2, + "\\valid_read(attr)",0, + __gen_e_acsl_valid_read); + __gen_e_acsl_or = __gen_e_acsl_valid_read; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Precondition"; + __gen_e_acsl_assert_data_2.pred_txt = "valid_null_attr: attr == \\null || \\valid_read(attr)"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_2.fct = "pthread_create"; + __gen_e_acsl_assert_data_2.line = 224; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 = + {.values = (void *)0}; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg); + if (arg == (void *)0) __gen_e_acsl_or_2 = 1; + else { + int __gen_e_acsl_valid_2; + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data_4,"arg",arg); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_4, + "sizeof(char)",0,sizeof(char)); + __gen_e_acsl_valid_2 = __e_acsl_valid(arg,sizeof(char),arg, + (void *)(& arg)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_4, + "\\valid((char *)arg)",0, + __gen_e_acsl_valid_2); + __gen_e_acsl_or_2 = __gen_e_acsl_valid_2; + } + __gen_e_acsl_assert_data_4.blocking = 1; + __gen_e_acsl_assert_data_4.kind = "Precondition"; + __gen_e_acsl_assert_data_4.pred_txt = "valid_null_arg: arg == \\null || \\valid((char *)arg)"; + __gen_e_acsl_assert_data_4.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_4.fct = "pthread_create"; + __gen_e_acsl_assert_data_4.line = 226; + __e_acsl_assert(__gen_e_acsl_or_2,& __gen_e_acsl_assert_data_4); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); + } + __retres = __e_acsl_pthread_create(thread,attr,start_routine,arg); + { + int __gen_e_acsl_or_3; + int __gen_e_acsl_or_4; + int __gen_e_acsl_or_5; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or_3 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + __gen_e_acsl_or_3 = __retres == 11; + } + if (__gen_e_acsl_or_3) __gen_e_acsl_or_4 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + __gen_e_acsl_or_4 = __retres == 22; + } + if (__gen_e_acsl_or_4) __gen_e_acsl_or_5 = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"\\result",0, + __retres); + __gen_e_acsl_or_5 = __retres == 1; + } + __gen_e_acsl_assert_data_5.blocking = 1; + __gen_e_acsl_assert_data_5.kind = "Postcondition"; + __gen_e_acsl_assert_data_5.pred_txt = "success_or_error:\n \\result == 0 || \\result == 11 || \\result == 22 || \\result == 1"; + __gen_e_acsl_assert_data_5.file = "FRAMAC_SHARE/libc/pthread.h"; + __gen_e_acsl_assert_data_5.fct = "pthread_create"; + __gen_e_acsl_assert_data_5.line = 230; + __e_acsl_assert(__gen_e_acsl_or_5,& __gen_e_acsl_assert_data_5); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5); + __e_acsl_delete_block((void *)(& arg)); + __e_acsl_delete_block((void *)(& start_routine)); + __e_acsl_delete_block((void *)(& attr)); + __e_acsl_delete_block((void *)(& thread)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; + } +} + +void __e_acsl_globals_init(void) +{ + static char __e_acsl_already_run = 0; + if (! __e_acsl_already_run) { + __e_acsl_already_run = 1; + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_join),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_join)); + __e_acsl_store_block((void *)(& __gen_e_acsl_pthread_create),(size_t)1); + __e_acsl_full_init((void *)(& __gen_e_acsl_pthread_create)); + __e_acsl_store_block((void *)(& thread_start),(size_t)1); + __e_acsl_full_init((void *)(& thread_start)); + __e_acsl_store_block((void *)(& __fc_p_tmpnam),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_tmpnam)); + __e_acsl_store_block((void *)(__fc_tmpnam),(size_t)2048); + __e_acsl_full_init((void *)(& __fc_tmpnam)); + __e_acsl_store_block((void *)(& __fc_p_fopen),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_fopen)); + __e_acsl_store_block((void *)(__fc_fopen),(size_t)128); + __e_acsl_full_init((void *)(& __fc_fopen)); + __e_acsl_store_block((void *)(& stdout),(size_t)8); + __e_acsl_full_init((void *)(& stdout)); + __e_acsl_store_block((void *)(& stdin),(size_t)8); + __e_acsl_full_init((void *)(& stdin)); + __e_acsl_store_block((void *)(& stderr),(size_t)8); + __e_acsl_full_init((void *)(& stderr)); + __e_acsl_store_block((void *)(& __fc_interrupted),(size_t)4); + __e_acsl_full_init((void *)(& __fc_interrupted)); + __e_acsl_store_block((void *)(& __fc_p_time_tm),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_time_tm)); + __e_acsl_store_block((void *)(& __fc_time_tm),(size_t)36); + __e_acsl_full_init((void *)(& __fc_time_tm)); + __e_acsl_store_block((void *)(& __fc_p_ctime),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_ctime)); + __e_acsl_store_block((void *)(__fc_ctime),(size_t)26); + __e_acsl_full_init((void *)(& __fc_ctime)); + __e_acsl_store_block((void *)(& __fc_time),(size_t)4); + __e_acsl_full_init((void *)(& __fc_time)); + __e_acsl_store_block((void *)(& __fc_p_sigaction),(size_t)8); + __e_acsl_full_init((void *)(& __fc_p_sigaction)); + __e_acsl_store_block((void *)(sigaction),(size_t)2080); + __e_acsl_full_init((void *)(& sigaction)); + __e_acsl_store_block((void *)(& pthread_join),(size_t)1); + __e_acsl_full_init((void *)(& pthread_join)); + __e_acsl_store_block((void *)(& pthread_create),(size_t)1); + __e_acsl_full_init((void *)(& pthread_create)); + __e_acsl_store_block((void *)(& errno),(size_t)4); + __e_acsl_full_init((void *)(& errno)); + } + return; +} + +void __e_acsl_globals_clean(void) +{ + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_join)); + __e_acsl_delete_block((void *)(& __gen_e_acsl_pthread_create)); + __e_acsl_delete_block((void *)(& thread_start)); + __e_acsl_delete_block((void *)(& __fc_p_tmpnam)); + __e_acsl_delete_block((void *)(__fc_tmpnam)); + __e_acsl_delete_block((void *)(& __fc_p_fopen)); + __e_acsl_delete_block((void *)(__fc_fopen)); + __e_acsl_delete_block((void *)(& stdout)); + __e_acsl_delete_block((void *)(& stdin)); + __e_acsl_delete_block((void *)(& stderr)); + __e_acsl_delete_block((void *)(& __fc_interrupted)); + __e_acsl_delete_block((void *)(& __fc_p_time_tm)); + __e_acsl_delete_block((void *)(& __fc_time_tm)); + __e_acsl_delete_block((void *)(& __fc_p_ctime)); + __e_acsl_delete_block((void *)(__fc_ctime)); + __e_acsl_delete_block((void *)(& __fc_time)); + __e_acsl_delete_block((void *)(& __fc_p_sigaction)); + __e_acsl_delete_block((void *)(sigaction)); + __e_acsl_delete_block((void *)(& pthread_join)); + __e_acsl_delete_block((void *)(& pthread_create)); + __e_acsl_delete_block((void *)(& errno)); + return; +} + +int main(void) +{ + int __retres; + pthread_t t; + __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8); + __e_acsl_globals_init(); + __e_acsl_store_block((void *)(& t),(size_t)4); + __e_acsl_store_block((void *)(& __retres),(size_t)4); + __gen_e_acsl_pthread_create(& t,(pthread_attr_t const *)0,& thread_start, + (void *)0); + __gen_e_acsl_pthread_join(t,(void **)0); + __e_acsl_full_init((void *)(& __retres)); + __retres = 0; + __e_acsl_delete_block((void *)(& t)); + __e_acsl_delete_block((void *)(& __retres)); + __e_acsl_globals_clean(); + __e_acsl_memory_clean(); + return __retres; +} + + diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/parallel_threads.res.oracle b/src/plugins/e-acsl/tests/concurrency/oracle/parallel_threads.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..8f495131885494f0c18f5d4b56c1834e63fe7908 --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/oracle/parallel_threads.res.oracle @@ -0,0 +1,171 @@ +[e-acsl] beginning translation. +[e-acsl] Due to the large number of function pointers in concurrent + code, the memory tracking dataflow analysis is deactivated + when activating the concurrency support of E-ACSL. +[e-acsl] Warning: annotating undefined function `pthread_cond_broadcast': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_cond_init': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_cond_wait': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_create': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_join': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_mutex_init': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_mutex_lock': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_mutex_unlock': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `perror': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `exit': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `usleep': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] FRAMAC_SHARE/libc/unistd.h:1116: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/stdlib.h:470: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/stdlib.h:472: Warning: + E-ACSL construct `abnormal termination case in behavior' + is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/stdio.h:484: Warning: + E-ACSL construct `predicates with labels' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/stdio.h:483: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:312: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:294: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:278: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:247: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:252: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:255: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:225: Warning: + E-ACSL construct `\valid_function' is not yet supported. Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:223: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:203: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:186: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:173: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] translation done in project "e-acsl". +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:279: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:279: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: + function __e_acsl_assert_register_ptr: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:286: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:287: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:288: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:289: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: + function __e_acsl_assert, behavior blocking: precondition got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:187: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:187: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:191: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:191: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: + function __e_acsl_assert_register_ptr: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:230: Warning: + function __e_acsl_assert, behavior blocking: precondition got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: + function __e_acsl_assert, behavior blocking: precondition got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: + function __e_acsl_assert, behavior blocking: precondition got status unknown. +[kernel:annot:missing-spec] parallel_threads.c:121: Warning: + Neither code nor specification for function pthread_mutex_trylock, generating default assigns from the prototype +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:313: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:313: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:316: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/unistd.h:1119: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/sequential_threads.res.oracle b/src/plugins/e-acsl/tests/concurrency/oracle/sequential_threads.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..11df192b2e43ead116e264fd970eb63272265d63 --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/oracle/sequential_threads.res.oracle @@ -0,0 +1,51 @@ +[e-acsl] beginning translation. +[e-acsl] Due to the large number of function pointers in concurrent + code, the memory tracking dataflow analysis is deactivated + when activating the concurrency support of E-ACSL. +[e-acsl] Warning: annotating undefined function `pthread_create': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_join': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:247: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:252: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:255: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:225: Warning: + E-ACSL construct `\valid_function' is not yet supported. Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:223: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] translation done in project "e-acsl". +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: + function __e_acsl_assert_register_ptr: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:230: Warning: + function __e_acsl_assert, behavior blocking: precondition got status unknown. diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/threads_debug.res.oracle b/src/plugins/e-acsl/tests/concurrency/oracle/threads_debug.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..8f495131885494f0c18f5d4b56c1834e63fe7908 --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/oracle/threads_debug.res.oracle @@ -0,0 +1,171 @@ +[e-acsl] beginning translation. +[e-acsl] Due to the large number of function pointers in concurrent + code, the memory tracking dataflow analysis is deactivated + when activating the concurrency support of E-ACSL. +[e-acsl] Warning: annotating undefined function `pthread_cond_broadcast': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_cond_init': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_cond_wait': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_create': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_join': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_mutex_init': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_mutex_lock': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_mutex_unlock': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `perror': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `exit': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `usleep': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] FRAMAC_SHARE/libc/unistd.h:1116: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/stdlib.h:470: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/stdlib.h:472: Warning: + E-ACSL construct `abnormal termination case in behavior' + is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/stdio.h:484: Warning: + E-ACSL construct `predicates with labels' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/stdio.h:483: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:312: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:294: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:278: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:247: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:252: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:255: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:225: Warning: + E-ACSL construct `\valid_function' is not yet supported. Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:223: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:203: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:186: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:173: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] translation done in project "e-acsl". +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:279: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:279: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: + function __e_acsl_assert_register_ptr: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:286: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:287: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:288: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:289: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:285: Warning: + function __e_acsl_assert, behavior blocking: precondition got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:187: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:187: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:191: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:191: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: + function __e_acsl_assert_register_ptr: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:230: Warning: + function __e_acsl_assert, behavior blocking: precondition got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: + function __e_acsl_assert, behavior blocking: precondition got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:226: Warning: + function __e_acsl_assert, behavior blocking: precondition got status unknown. +[kernel:annot:missing-spec] parallel_threads.c:121: Warning: + Neither code nor specification for function pthread_mutex_trylock, generating default assigns from the prototype +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:313: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:313: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:316: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/unistd.h:1119: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/threads_safe_locations.res.oracle b/src/plugins/e-acsl/tests/concurrency/oracle/threads_safe_locations.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..e4d7cbce644423d1685f5c6a2e7083b9a955340a --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/oracle/threads_safe_locations.res.oracle @@ -0,0 +1,42 @@ +[e-acsl] beginning translation. +[e-acsl] Due to the large number of function pointers in concurrent + code, the memory tracking dataflow analysis is deactivated + when activating the concurrency support of E-ACSL. +[e-acsl] Warning: annotating undefined function `pthread_create': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] Warning: annotating undefined function `pthread_join': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:247: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:252: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:255: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:225: Warning: + E-ACSL construct `\valid_function' is not yet supported. Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/pthread.h:223: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] translation done in project "e-acsl". +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:223: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:231: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/pthread.h:230: Warning: + function __e_acsl_assert, behavior blocking: precondition got status unknown. diff --git a/src/plugins/e-acsl/tests/concurrency/oracle_dev/parallel_threads.e-acsl.err.log b/src/plugins/e-acsl/tests/concurrency/oracle_dev/parallel_threads.e-acsl.err.log new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/plugins/e-acsl/tests/concurrency/oracle_dev/sequential_threads.e-acsl.err.log b/src/plugins/e-acsl/tests/concurrency/oracle_dev/sequential_threads.e-acsl.err.log new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/plugins/e-acsl/tests/concurrency/oracle_dev/threads_debug.e-acsl.err.log b/src/plugins/e-acsl/tests/concurrency/oracle_dev/threads_debug.e-acsl.err.log new file mode 100644 index 0000000000000000000000000000000000000000..b45ae94e6e9788debb50c86503a6b334446fdf17 --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/oracle_dev/threads_debug.e-acsl.err.log @@ -0,0 +1,181 @@ +>>> HEAP --------------------- + Application: 128 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 128 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> STACK -------------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> GLOBAL ------------------- + Application: xxxkB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : xxxkB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : xxxkB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> TLS ---------------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> VDSO --------------------- + Application: xxxkB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : xxxkB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : xxxkB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> -------------------------- +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread stack ------------- + Application: 16 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 16 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } +>>> Thread TLS --------------- + Application: 2 MB [0x0000-0000-0000, 0x0000-0000-0000] + Primary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } + Secondary : 2 MB [0x0000-0000-0000, 0x0000-0000-0000]{ Offset:xxxxx } diff --git a/src/plugins/e-acsl/tests/concurrency/oracle_dev/threads_safe_locations.e-acsl.err.log b/src/plugins/e-acsl/tests/concurrency/oracle_dev/threads_safe_locations.e-acsl.err.log new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/plugins/e-acsl/tests/concurrency/parallel_threads.c b/src/plugins/e-acsl/tests/concurrency/parallel_threads.c new file mode 100644 index 0000000000000000000000000000000000000000..bc492e28d8b1a147b3a2965a6ee6ce4cf02384f5 --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/parallel_threads.c @@ -0,0 +1,143 @@ +#include <errno.h> +#include <pthread.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#define SIZE 10 + +int *values[SIZE]; + +int write_count = 0; +int read_count = 0; +pthread_cond_t write_cond, read_cond; +pthread_mutex_t write_mutex, read_mutex; + +#define WAIT_UNTIL_CONDVAR(count_var, mutex_var) \ + do { \ + int res = pthread_mutex_trylock(&mutex_var); \ + if (res == 0) { \ + int done = count_var == SIZE; \ + pthread_mutex_unlock(&mutex_var); \ + if (done) { \ + break; \ + } \ + } else if (res != EBUSY) { \ + perror("Unable to lock " #mutex_var); \ + } \ + usleep(100); \ + } while (1) + +/*@ ensures \let idx = *(int*)arg; + \valid(values[idx]) && \initialized(values[idx]); */ +void *write_value(void *arg) { + if (pthread_mutex_lock(&write_mutex) != 0) { + perror("Unable to lock mutex in write_value()"); + exit(1); + } + ++write_count; + if (pthread_cond_wait(&write_cond, &write_mutex) != 0) { + perror("Unable to wait on condvar in write_value()"); + exit(1); + } + if (pthread_mutex_unlock(&write_mutex) != 0) { + perror("Unable to unlock mutex in write_value()"); + exit(1); + } + usleep(100); + + int idx = *(int *)arg; + values[idx] = malloc(sizeof(int)); + *values[idx] = idx; + return NULL; +} + +/* The checks `\valid(values[idx])` and `\initialized(values[idx])` fail because + * even if `read_value()` waits for ̀write_value()` to be finished before + * reading the value, the generated code will check the specification before + * calling `read_value()`, where we do not know if `write_value()` is finished. + */ +/*@ requires !(\let idx = *(int*)arg; + \valid_read(values[idx]) && \initialized(values[idx])); */ +void *read_value(void *arg) { + if (pthread_mutex_lock(&read_mutex) != 0) { + perror("Unable to lock mutex in read_value()"); + exit(1); + } + ++read_count; + if (pthread_cond_wait(&read_cond, &read_mutex) != 0) { + perror("Unable to wait on condvar in read_value()"); + exit(1); + } + if (pthread_mutex_unlock(&read_mutex) != 0) { + perror("Unable to unlock mutex in read_value()"); + exit(1); + } + usleep(100); + + /* The contract can instead be written here so that the synchronisation + * between `read_value()` and `write_value()` is done before evaluating the + * specification. */ + /*@ requires \let idx = *(int*)arg; + \valid_read(values[idx]) && \initialized(values[idx]); */ + { + int idx = *(int *)arg; + //@ assert *values[idx] == idx; + free(values[idx]); + return NULL; + } +} + +int main() { + pthread_t writers[SIZE]; + pthread_t readers[SIZE]; + int args[SIZE]; + + if (pthread_mutex_init(&write_mutex, NULL) != 0) { + perror("Unable to initialize write mutex"); + exit(1); + } + if (pthread_cond_init(&write_cond, NULL) != 0) { + perror("Unable to initialize write cond var"); + exit(1); + } + if (pthread_mutex_init(&read_mutex, NULL) != 0) { + perror("Unable to initialize read mutex"); + exit(1); + } + if (pthread_cond_init(&read_cond, NULL) != 0) { + perror("Unable to initialize read cond var"); + exit(1); + } + + // Create all threads + for (int i = 0; i < SIZE; ++i) { + args[i] = i; + pthread_create(&writers[i], NULL, write_value, &args[i]); + pthread_create(&readers[i], NULL, read_value, &args[i]); + } + + // Wait for every thread to be waiting on their condvar + WAIT_UNTIL_CONDVAR(write_count, write_mutex); + WAIT_UNTIL_CONDVAR(read_count, read_mutex); + + // Wake up writers and wait for completion + if (pthread_cond_broadcast(&write_cond) != 0) { + perror("Unable to broadcast to write cond var"); + exit(11); + } + for (int i = 0; i < SIZE; ++i) { + pthread_join(writers[i], NULL); + } + + // Wake up readers and wait for completion + if (pthread_cond_broadcast(&read_cond) != 0) { + perror("Unable to broadcast to read cond var"); + exit(12); + } + for (int i = 0; i < SIZE; ++i) { + pthread_join(readers[i], NULL); + } + + return 0; +} diff --git a/src/plugins/e-acsl/tests/concurrency/sequential_threads.c b/src/plugins/e-acsl/tests/concurrency/sequential_threads.c new file mode 100644 index 0000000000000000000000000000000000000000..4ac916dc00e82306d98a78d261bbb5b45f0374df --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/sequential_threads.c @@ -0,0 +1,37 @@ +#include <pthread.h> +#include <stdlib.h> + +#define SIZE 10 + +int *values[SIZE]; + +void *write_value(void *arg) { + int idx = *(int *)arg; + values[idx] = malloc(sizeof(int)); + *values[idx] = idx; + return NULL; +} + +void *read_value(void *arg) { + int idx = *(int *)arg; + //@ assert *values[idx] == idx; + free(values[idx]); + return NULL; +} + +int main() { + pthread_t t; + int args[SIZE]; + + for (int i = 0; i < SIZE; ++i) { + args[i] = i; + pthread_create(&t, NULL, write_value, &args[i]); + pthread_join(t, NULL); + } + for (int i = 0; i < SIZE; ++i) { + pthread_create(&t, NULL, read_value, &args[i]); + pthread_join(t, NULL); + } + + return 0; +} diff --git a/src/plugins/e-acsl/tests/concurrency/test_config b/src/plugins/e-acsl/tests/concurrency/test_config new file mode 100644 index 0000000000000000000000000000000000000000..96bf5fb8d3b8dd17140680e1a74449dcc299d98c --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/test_config @@ -0,0 +1 @@ +STDOPT: #"-e-acsl-concurrency" diff --git a/src/plugins/e-acsl/tests/concurrency/test_config_dev b/src/plugins/e-acsl/tests/concurrency/test_config_dev new file mode 100644 index 0000000000000000000000000000000000000000..a34bd15a2df78706ef2cf48ee51c887636e0b22d --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/test_config_dev @@ -0,0 +1 @@ +MACRO: ROOT_EACSL_GCC_OPTS_EXT --concurrency diff --git a/src/plugins/e-acsl/tests/concurrency/threads_debug.c b/src/plugins/e-acsl/tests/concurrency/threads_debug.c new file mode 100644 index 0000000000000000000000000000000000000000..ff3efa65c7079e0dfd67ff7ffc16802ad76dbf77 --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/threads_debug.c @@ -0,0 +1,11 @@ +/* run.config, run.config_dev + COMMENT: This test is identical to `parallel_thread.c` but with RTL debug code + COMMENT: activated. + MACRO: ROOT_EACSL_GCC_OPTS_EXT --rt-debug --rt-verbose --concurrency + + COMMENT: Filter the addresses of the output so that the test is deterministic. + MACRO: ROOT_EACSL_EXEC_FILTER @SEDCMD@ -e s_0x[0-9a-f-]*_0x0000-0000-0000_g | @SEDCMD@ -e s_Offset:\s[0-9-]*_Offset:xxxxx_g | @SEDCMD@ -e s/[0-9]*\skB/xxxkB/g +*/ + +// Include existing test +#include "parallel_threads.c" diff --git a/src/plugins/e-acsl/tests/concurrency/threads_safe_locations.c b/src/plugins/e-acsl/tests/concurrency/threads_safe_locations.c new file mode 100644 index 0000000000000000000000000000000000000000..52850ca6aedd650e196d879c1f91c2ee1e79a809 --- /dev/null +++ b/src/plugins/e-acsl/tests/concurrency/threads_safe_locations.c @@ -0,0 +1,19 @@ +#include <errno.h> +#include <pthread.h> +#include <stdio.h> + +void *thread_start(void *arg) { + //@ assert \valid(stdout) && \initialized(stdout); + //@ assert \valid(stderr) && \initialized(stderr); + //@ assert \valid(stdin) && \initialized(stdin); + int *addrof_errno = &errno; + //@ assert \valid(addrof_errno) && \initialized(addrof_errno); + return NULL; +} + +int main() { + pthread_t t; + pthread_create(&t, NULL, thread_start, NULL); + pthread_join(t, NULL); + return 0; +} diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_acsl_check.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_acsl_check.c index 14e49f5b1268f9ba22a39ca94da95337f6cfec2f..a2d7766cd3504a9883416a671dd37272f3bdb77f 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_acsl_check.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_acsl_check.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_decrease.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_decrease.c index d274d0641b4054a6e270ef075c857e8a049832eb..ea2bac72e0d84d7d055f219610d4a597bbf4b0cd 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_decrease.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_decrease.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int f(int x) diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_false.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_false.c index a9d1e1b05ad8ceef4f2e515181c595e8c55f1103..c3a7f41246d04a2faa4da3d20d41b6a46afcdc31 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_false.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_false.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_function_contract.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_function_contract.c index aab67da292ac36ac9ebd64fad8505440b7988c0f..96c261c12a93e3a1237c3c979ac579d50b3acac4 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_function_contract.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_function_contract.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int X = 0; diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_ghost.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_ghost.c index 6581067bcbcd29c5fcf1515c75174f7ac1026646..8b56c962f015d149c61123a5496c474503f04638 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_ghost.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_ghost.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int G = 0; diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_invariant.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_invariant.c index f1ad2dbabb348d634be02adde553946b670e3e34..651c79d96766f237a00f9ce84df229b611a0c30c 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_invariant.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_invariant.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_labeled_stmt.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_labeled_stmt.c index b94df8796d7641cf5b13fd25ff8b2e8ede87883a..ffe68532b72ad38037abbf923b009cd4898a7f62 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_labeled_stmt.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_labeled_stmt.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int X = 0; @@ -13,7 +17,6 @@ int __gen_e_acsl_main(void) int __retres; goto L1; L1: - /*@ assert X == 0; */ { __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"X",0,X); @@ -26,11 +29,10 @@ int __gen_e_acsl_main(void) __e_acsl_assert(X == 0,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } + /*@ assert X == 0; */ ; X = 1; goto L2; L2: - /*@ requires X == 1; - ensures X == 2; */ { { __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = @@ -44,8 +46,10 @@ int __gen_e_acsl_main(void) __gen_e_acsl_assert_data_2.line = 13; __e_acsl_assert(X == 1,& __gen_e_acsl_assert_data_2); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); - X = 2; } + /*@ requires X == 1; + ensures X == 2; */ + X = 2; __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = {.values = (void *)0}; __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,"X",0,X); diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_lazy.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_lazy.c index c962ed4af88a507804d85d735acccc84603fac78..c2bef02ac47ab5bffefc44d73e9757a4e711b171 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_lazy.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_lazy.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_loop.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_loop.c index 6cdd967ce18b220db7953298467462887795288a..54814a5b538a77adeaf47984e095a9877007f242 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_loop.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_loop.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; void simple_loop(void) diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_nested_code_annot.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_nested_code_annot.c index fd63929b6db8cef54f0b357d2b640a0309136ecf..b8f02566ff26b92842a2a4e2e3008347b8e77727 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_nested_code_annot.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_nested_code_annot.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_printed_data.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_printed_data.c index ef2bbaa95c322d5ce8eccbde0447f58cfc533211..0f25bc6887d87786a36f164663702eac90e4feb5 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_printed_data.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_printed_data.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_result.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_result.c index a0d975c478dd30492a5a277c9450b014f00e1d6c..b90c677cd6740b1f66f7d8d1ae345b67489ca9dc 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_result.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_result.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ ensures \result == (int)(\old(x) - \old(x)); */ diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_rte.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_rte.c index ab14b8282fe6cdde7bb187589d11d9e2deffefca..24275e968184d862756130fdadacff599656bb9a 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_rte.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_rte.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ requires 1 % a == 1; diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_stmt_contract.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_stmt_contract.c index 6c74d5df0769d085e55fd9cdbc3d60f912a3fb58..38f76c10b3783e62d17e74e331013959a755f086 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_stmt_contract.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_stmt_contract.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_true.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_true.c index 3d72a45dcf2c73edf6221511ba65f0c655e29f30..ccc710ca0a41352e2fa259d2c7d21e822967b397 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_true.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_true.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/constructs/oracle/gen_typedef.c b/src/plugins/e-acsl/tests/constructs/oracle/gen_typedef.c index a72587b1320ac3b22f0f69e8d50582bab7f5e2ce..67731cb9825960598f246237040f949c4a9cce22 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/gen_typedef.c +++ b/src/plugins/e-acsl/tests/constructs/oracle/gen_typedef.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; typedef unsigned char uint8; diff --git a/src/plugins/e-acsl/tests/examples/oracle/gen_functions_contiki.c b/src/plugins/e-acsl/tests/examples/oracle/gen_functions_contiki.c index c321d78c65903e3eeec3e96d9ec4b9699ee8627a..3eb7673ca1170c5eba06cc32df1648cbca7c5271 100644 --- a/src/plugins/e-acsl/tests/examples/oracle/gen_functions_contiki.c +++ b/src/plugins/e-acsl/tests/examples/oracle/gen_functions_contiki.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct list { diff --git a/src/plugins/e-acsl/tests/examples/oracle/gen_linear_search.c b/src/plugins/e-acsl/tests/examples/oracle/gen_linear_search.c index ed8fcc6807f8fdcf0a5fbc9d92464e72d7f84618..f390ae24347c9fd48b076756cd1f06a8811c30c2 100644 --- a/src/plugins/e-acsl/tests/examples/oracle/gen_linear_search.c +++ b/src/plugins/e-acsl/tests/examples/oracle/gen_linear_search.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int A[10]; diff --git a/src/plugins/e-acsl/tests/format/oracle/fprintf.res.oracle b/src/plugins/e-acsl/tests/format/oracle/fprintf.res.oracle index a33c96cfed628a46547dc226fafaf172a6a45d8a..87d5a40951cbea3902b5532c1fa6ecea3ab9206f 100644 --- a/src/plugins/e-acsl/tests/format/oracle/fprintf.res.oracle +++ b/src/plugins/e-acsl/tests/format/oracle/fprintf.res.oracle @@ -17,10 +17,10 @@ [e-acsl] FRAMAC_SHARE/libc/unistd.h:843: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. -[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:79: Warning: +[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:82: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. -[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:86: Warning: +[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:89: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. [e-acsl] FRAMAC_SHARE/libc/stdlib.h:470: Warning: diff --git a/src/plugins/e-acsl/tests/format/oracle/gen_fprintf.c b/src/plugins/e-acsl/tests/format/oracle/gen_fprintf.c index d13ce9530e4af785dd7394dccfb56688d927f257..a20d48aaf6467bb7b7dc9c0858f19601320172b9 100644 --- a/src/plugins/e-acsl/tests/format/oracle/gen_fprintf.c +++ b/src/plugins/e-acsl/tests/format/oracle/gen_fprintf.c @@ -1,4 +1,6 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" #include "signal.h" #include "stddef.h" #include "stdint.h" @@ -8,6 +10,7 @@ #include "sys/time.h" #include "sys/types.h" #include "sys/wait.h" +#include "time.h" #include "unistd.h" char *__gen_e_acsl_literal_string_31; char *__gen_e_acsl_literal_string_30; @@ -182,7 +185,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data.pred_txt = "stat_loc_non_null: valid_stat_loc: \\valid(stat_loc)"; __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data.fct = "waitpid"; - __gen_e_acsl_assert_data.line = 92; + __gen_e_acsl_assert_data.line = 95; __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } @@ -209,7 +212,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data_2.pred_txt = "result_ok_or_error: \\result == -1 || \\result >= 0"; __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data_2.fct = "waitpid"; - __gen_e_acsl_assert_data_2.line = 84; + __gen_e_acsl_assert_data_2.line = 87; __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = @@ -242,7 +245,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data_3.pred_txt = "initialization: stat_loc_init_on_success:\n \\result >= 0 && \\old(stat_loc) != \\null ==> \\initialized(\\old(stat_loc))"; __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data_3.fct = "waitpid"; - __gen_e_acsl_assert_data_3.line = 86; + __gen_e_acsl_assert_data_3.line = 89; __e_acsl_assert(__gen_e_acsl_implies,& __gen_e_acsl_assert_data_3); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); __e_acsl_contract_clean(__gen_e_acsl_contract); diff --git a/src/plugins/e-acsl/tests/format/oracle/gen_printf.c b/src/plugins/e-acsl/tests/format/oracle/gen_printf.c index d9a1a7302c53451bf506f1e44ee56fdcf09c9f9f..49821bd7fab20317861c14a3f7d89ac977c9de5d 100644 --- a/src/plugins/e-acsl/tests/format/oracle/gen_printf.c +++ b/src/plugins/e-acsl/tests/format/oracle/gen_printf.c @@ -1,4 +1,6 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" #include "signal.h" #include "stddef.h" #include "stdint.h" @@ -1071,7 +1073,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data.pred_txt = "stat_loc_non_null: valid_stat_loc: \\valid(stat_loc)"; __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data.fct = "waitpid"; - __gen_e_acsl_assert_data.line = 92; + __gen_e_acsl_assert_data.line = 95; __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } @@ -1098,7 +1100,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data_2.pred_txt = "result_ok_or_error: \\result == -1 || \\result >= 0"; __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data_2.fct = "waitpid"; - __gen_e_acsl_assert_data_2.line = 84; + __gen_e_acsl_assert_data_2.line = 87; __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 = @@ -1131,7 +1133,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) __gen_e_acsl_assert_data_3.pred_txt = "initialization: stat_loc_init_on_success:\n \\result >= 0 && \\old(stat_loc) != \\null ==> \\initialized(\\old(stat_loc))"; __gen_e_acsl_assert_data_3.file = "FRAMAC_SHARE/libc/sys/wait.h"; __gen_e_acsl_assert_data_3.fct = "waitpid"; - __gen_e_acsl_assert_data_3.line = 86; + __gen_e_acsl_assert_data_3.line = 89; __e_acsl_assert(__gen_e_acsl_implies,& __gen_e_acsl_assert_data_3); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3); __e_acsl_contract_clean(__gen_e_acsl_contract); diff --git a/src/plugins/e-acsl/tests/format/oracle/gen_sprintf.c b/src/plugins/e-acsl/tests/format/oracle/gen_sprintf.c index 3682e4b4d22c23bf67194ce96bfd7f3529085ac0..d8e75e298d384a07be57646a7a6c137d46bd2339 100644 --- a/src/plugins/e-acsl/tests/format/oracle/gen_sprintf.c +++ b/src/plugins/e-acsl/tests/format/oracle/gen_sprintf.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/format/oracle/printf.res.oracle b/src/plugins/e-acsl/tests/format/oracle/printf.res.oracle index 57529e5daacfc80a51d916f693f84e7d15fdef13..7cffddb92f552e1957e8f4cf02fe661fd5b77ad3 100644 --- a/src/plugins/e-acsl/tests/format/oracle/printf.res.oracle +++ b/src/plugins/e-acsl/tests/format/oracle/printf.res.oracle @@ -80,10 +80,10 @@ [e-acsl] FRAMAC_SHARE/libc/unistd.h:843: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. -[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:79: Warning: +[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:82: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. -[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:86: Warning: +[e-acsl] FRAMAC_SHARE/libc/sys/wait.h:89: Warning: E-ACSL construct `assigns clause in behavior' is not yet supported. Ignoring annotation. [e-acsl] FRAMAC_SHARE/libc/stdlib.h:470: Warning: diff --git a/src/plugins/e-acsl/tests/full-mtracking/oracle/gen_addrOf.c b/src/plugins/e-acsl/tests/full-mtracking/oracle/gen_addrOf.c index 8a739106b999493f61601e671385fb725bf9828b..2bfaddf7fd9fa6b254622fac26cf30c450922d08 100644 --- a/src/plugins/e-acsl/tests/full-mtracking/oracle/gen_addrOf.c +++ b/src/plugins/e-acsl/tests/full-mtracking/oracle/gen_addrOf.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; void f(void) diff --git a/src/plugins/e-acsl/tests/gmp-only/oracle/gen_arith.c b/src/plugins/e-acsl/tests/gmp-only/oracle/gen_arith.c index 31da0a1ed1e1db9f4f3e2c4bf11e66deb91ceca4..49d42dfc6c9aef366ad1d395654d9d49ef7ca65e 100644 --- a/src/plugins/e-acsl/tests/gmp-only/oracle/gen_arith.c +++ b/src/plugins/e-acsl/tests/gmp-only/oracle/gen_arith.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/gmp-only/oracle/gen_extended_quantifiers.c b/src/plugins/e-acsl/tests/gmp-only/oracle/gen_extended_quantifiers.c index fc917f1232537104157f01ecc697a415c6a4edc7..e85555c31985242aa8aba85a3b75c94a223627ae 100644 --- a/src/plugins/e-acsl/tests/gmp-only/oracle/gen_extended_quantifiers.c +++ b/src/plugins/e-acsl/tests/gmp-only/oracle/gen_extended_quantifiers.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/gmp-only/oracle/gen_functions.c b/src/plugins/e-acsl/tests/gmp-only/oracle/gen_functions.c index e6e0192a382375049ebe0b95efa626ee90543073..9a6b723e62272b8954fd816710f7ae0440e6edbe 100644 --- a/src/plugins/e-acsl/tests/gmp-only/oracle/gen_functions.c +++ b/src/plugins/e-acsl/tests/gmp-only/oracle/gen_functions.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct mystruct { diff --git a/src/plugins/e-acsl/tests/libc/oracle/gen_file.c b/src/plugins/e-acsl/tests/libc/oracle/gen_file.c index 7aeb3b738036855d46085372594d78de42a0f766..3bb8d905552aba07b763ba872ff9473caf954d53 100644 --- a/src/plugins/e-acsl/tests/libc/oracle/gen_file.c +++ b/src/plugins/e-acsl/tests/libc/oracle/gen_file.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string; char *__gen_e_acsl_literal_string_2; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/libc/oracle/gen_mem.c b/src/plugins/e-acsl/tests/libc/oracle/gen_mem.c index 3983d17f026c778b7a99dbaee0163da01fd57c7c..9ab927677560a25941b69033274241d1c9e0d621 100644 --- a/src/plugins/e-acsl/tests/libc/oracle/gen_mem.c +++ b/src/plugins/e-acsl/tests/libc/oracle/gen_mem.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "string.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ requires valid_dest: valid_or_empty(dest, n); diff --git a/src/plugins/e-acsl/tests/libc/oracle/gen_sprintf.c b/src/plugins/e-acsl/tests/libc/oracle/gen_sprintf.c index c14ec02d825a22d9f762044d1ca25ef7ec032f83..16a88485d71ba1ada9531b509e986dbe305cbeb8 100644 --- a/src/plugins/e-acsl/tests/libc/oracle/gen_sprintf.c +++ b/src/plugins/e-acsl/tests/libc/oracle/gen_sprintf.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/libc/oracle/gen_str.c b/src/plugins/e-acsl/tests/libc/oracle/gen_str.c index e9d4aad0124220c05492e150f65789e420cccddd..9a5c9cb64577e8610537624d0f9219c807fc194b 100644 --- a/src/plugins/e-acsl/tests/libc/oracle/gen_str.c +++ b/src/plugins/e-acsl/tests/libc/oracle/gen_str.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "string.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/memory/oracle/decl_in_switch.res.oracle b/src/plugins/e-acsl/tests/memory/oracle/decl_in_switch.res.oracle index 727a00d39c68d9b4517c5586ab309952f7fd60bd..f57964d77a4ba2e5bec9ba8e6b882dc2a3e671d4 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/decl_in_switch.res.oracle +++ b/src/plugins/e-acsl/tests/memory/oracle/decl_in_switch.res.oracle @@ -12,12 +12,36 @@ [eva:alarm] decl_in_switch.c:30: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. +[eva:alarm] decl_in_switch.c:35: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] decl_in_switch.c:35: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. [eva:alarm] decl_in_switch.c:45: Warning: function __e_acsl_assert_register_ulong: precondition data->values == \null || \valid(data->values) got status unknown. [eva:alarm] decl_in_switch.c:45: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. +[eva:alarm] decl_in_switch.c:55: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] decl_in_switch.c:55: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] decl_in_switch.c:61: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] decl_in_switch.c:61: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] decl_in_switch.c:84: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] decl_in_switch.c:84: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. [eva:alarm] decl_in_switch.c:74: Warning: function __e_acsl_assert_register_ulong: precondition data->values == \null || \valid(data->values) got status unknown. diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_addrOf.c b/src/plugins/e-acsl/tests/memory/oracle/gen_addrOf.c index a3115efb6ae789ce2012610c4b502e318597fe37..5bd22c0c309332b9d6debd3ad73b000eaeec4736 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_addrOf.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_addrOf.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; void f(void) diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_alias.c b/src/plugins/e-acsl/tests/memory/oracle/gen_alias.c index 5d98579f13212b3449b10cfc99659c764799b93b..22db7776b56bf72e22839f15db171652896df652 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_alias.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_alias.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; void f(int *dest, int val) diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_array_overflow.c b/src/plugins/e-acsl/tests/memory/oracle/gen_array_overflow.c index 627ba8ebd73ec0adc96f2eafc8c7ebcb88f5836c..00caeae3b6f385c7cd77aa7e3ef244aea40575ca 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_array_overflow.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_array_overflow.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct dat { diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_base_addr.c b/src/plugins/e-acsl/tests/memory/oracle/gen_base_addr.c index c1f105f635d6e8d3940e8e94d4878ba23761d89f..ffe642164ba07f4c73bb7a6b3f48617c0baad823 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_base_addr.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_base_addr.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int A[4] = {1, 2, 3, 4}; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_block_length.c b/src/plugins/e-acsl/tests/memory/oracle/gen_block_length.c index 7f5ae9ee7ac353023472b65612bf2b150362dc68..24938d7d3220c195d8d368abaa74cb732fffbeee 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_block_length.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_block_length.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int A[4] = {1, 2, 3, 4}; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_block_valid.c b/src/plugins/e-acsl/tests/memory/oracle/gen_block_valid.c index 0c94b486fbf4aebc126c8b28a8e715518152e3de..3007ee2ca7ea1554d243c7c7f805417f2e643d55 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_block_valid.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_block_valid.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int A = 1; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_bypassed_var.c b/src/plugins/e-acsl/tests/memory/oracle/gen_bypassed_var.c index c6d992e7e275fdcab3b559934a03c269fa1b1080..9db991fcd5f00ae965f4eeec8d74a666bc4a266b 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_bypassed_var.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_bypassed_var.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(int argc, char const **argv) @@ -12,7 +16,8 @@ int main(int argc, char const **argv) { int *p; __e_acsl_store_block((void *)(& p),(size_t)8); - L: __e_acsl_store_block_duplicate((void *)(& p),(size_t)8); + L: + __e_acsl_store_block_duplicate((void *)(& p),(size_t)8); __e_acsl_full_init((void *)(& p)); p = & argc; { diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_call.c b/src/plugins/e-acsl/tests/memory/oracle/gen_call.c index 3dd5219ba2395324397ee062d598742ad424c235..a8d4fb414519692996780a36c2c2ce94f9bfb88a 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_call.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_call.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ ensures \valid(\result); */ diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_compound_initializers.c b/src/plugins/e-acsl/tests/memory/oracle/gen_compound_initializers.c index 3ce3877cb0d4a00ff8c10abf3f7bcf22446afb0f..b2275a5f2b20a5f7a2d4be59ef97fbe75452a39b 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_compound_initializers.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_compound_initializers.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string_3; char *__gen_e_acsl_literal_string; char *__gen_e_acsl_literal_string_2; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_constructor.c b/src/plugins/e-acsl/tests/memory/oracle/gen_constructor.c index e71935e27a5fc4e4b1c753136656b1a7fb438365..0583c398c29051a7ee2a57308b36fb2ac684898d 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_constructor.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_constructor.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" char *__gen_e_acsl_literal_string_2; char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_ctype_macros.c b/src/plugins/e-acsl/tests/memory/oracle/gen_ctype_macros.c index 4b392ac77cfd22feb1ca36a2ad9a822af66443c2..748ac1693558af156c58f32a99f57525c83e7250 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_ctype_macros.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_ctype_macros.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ #include "ctype.h" +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ requires c_uchar_or_eof: (0 <= c <= 255) || c == -1; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_decl_in_switch.c b/src/plugins/e-acsl/tests/memory/oracle/gen_decl_in_switch.c index 237758e5565ef122baff5e2cba5330babd9f91ca..0d716b69a95ffc84f9c23af258a85e38a030c8fb 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_decl_in_switch.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_decl_in_switch.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; void decl_in_switch(int value) @@ -10,7 +14,8 @@ void decl_in_switch(int value) switch (value) { int *p; __e_acsl_store_block((void *)(& p),(size_t)8); - default: __e_acsl_store_block_duplicate((void *)(& p),(size_t)8); + default: + __e_acsl_store_block_duplicate((void *)(& p),(size_t)8); __e_acsl_full_init((void *)(& p)); p = & value; __e_acsl_delete_block((void *)(& p)); @@ -100,7 +105,7 @@ void compound_decl_and_init(int value) __e_acsl_delete_block((void *)(& c)); break; case 1: __e_acsl_store_block_duplicate((void *)(& c),(size_t)4); - ; + ; int d = 4; __e_acsl_store_block((void *)(& d),(size_t)4); __e_acsl_full_init((void *)(& d)); @@ -192,7 +197,8 @@ void separate_decl_and_init(int value) __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); } /*@ assert \valid(&b); */ ; - case 0: __e_acsl_store_block_duplicate((void *)(& c),(size_t)4); + case 0: + __e_acsl_store_block_duplicate((void *)(& c),(size_t)4); __e_acsl_store_block_duplicate((void *)(& d),(size_t)4); ; __e_acsl_full_init((void *)(& c)); @@ -222,7 +228,8 @@ void separate_decl_and_init(int value) __e_acsl_delete_block((void *)(& c)); __e_acsl_delete_block((void *)(& d)); break; - case 1: __e_acsl_store_block_duplicate((void *)(& c),(size_t)4); + case 1: + __e_acsl_store_block_duplicate((void *)(& c),(size_t)4); __e_acsl_store_block_duplicate((void *)(& d),(size_t)4); ; __e_acsl_full_init((void *)(& d)); @@ -290,7 +297,7 @@ void label_in_switch(int value) } /*@ assert \valid(&d); */ ; L: case 0: __e_acsl_store_block_duplicate((void *)(& d),(size_t)4); - ; + ; int e = 1; __e_acsl_store_block((void *)(& e),(size_t)4); __e_acsl_full_init((void *)(& e)); @@ -319,7 +326,8 @@ void label_in_switch(int value) __e_acsl_delete_block((void *)(& d)); __e_acsl_delete_block((void *)(& e)); break; - case 1: __e_acsl_store_block_duplicate((void *)(& d),(size_t)4); + case 1: + __e_acsl_store_block_duplicate((void *)(& d),(size_t)4); __e_acsl_store_block_duplicate((void *)(& e),(size_t)4); ; int ff = 2; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_early_exit.c b/src/plugins/e-acsl/tests/memory/oracle/gen_early_exit.c index e49467843a082733e3b4b4a3c80749fbae674a76..f7356a6d34eab9c51448d0a974e4a7381b20f681 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_early_exit.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_early_exit.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int goto_bts(void) @@ -57,7 +61,6 @@ int goto_bts(void) __e_acsl_delete_block((void *)(& a)); } L: - /*@ assert !\valid(p); */ { int __gen_e_acsl_initialized_2; int __gen_e_acsl_and_2; @@ -95,6 +98,7 @@ int goto_bts(void) __e_acsl_assert(! __gen_e_acsl_and_2,& __gen_e_acsl_assert_data_2); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); } + /*@ assert !\valid(p); */ ; __retres = 0; __e_acsl_delete_block((void *)(& p)); return __retres; @@ -142,7 +146,6 @@ int goto_valid(void) } } FIRST: - /*@ assert \valid(p); */ { int __gen_e_acsl_initialized; int __gen_e_acsl_and; @@ -179,6 +182,7 @@ int goto_valid(void) __e_acsl_assert(__gen_e_acsl_and,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } + /*@ assert \valid(p); */ ; { int __gen_e_acsl_initialized_2; int __gen_e_acsl_and_2; @@ -264,7 +268,6 @@ int goto_valid(void) __e_acsl_delete_block((void *)(& a1)); } SECOND: - /*@ assert !\valid(p); */ { int __gen_e_acsl_initialized_4; int __gen_e_acsl_and_4; @@ -301,6 +304,7 @@ int goto_valid(void) __e_acsl_assert(! __gen_e_acsl_and_4,& __gen_e_acsl_assert_data_4); __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4); } + /*@ assert !\valid(p); */ ; { int __gen_e_acsl_initialized_5; int __gen_e_acsl_and_5; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_errno.c b/src/plugins/e-acsl/tests/memory/oracle/gen_errno.c index b50bb9bb84e6a0f3266350bf8829afe6528926b0..231296afc7f6a405937ada2872fbc93dba0bfca7 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_errno.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_errno.c @@ -1,9 +1,13 @@ /* Generated by Frama-C */ #include "errno.h" +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; void __e_acsl_globals_init(void) diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_freeable.c b/src/plugins/e-acsl/tests/memory/oracle/gen_freeable.c index 098893b9955cb8fb82fd45a335f12514202c640a..f02b64b4c9ff2911d1625bae5e4b81f8fdd62eaa 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_freeable.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_freeable.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; char array[1024]; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_ghost_parameters.c b/src/plugins/e-acsl/tests/memory/oracle/gen_ghost_parameters.c index 8750fdf7e2e0f192ef23eb6b78929f045144ad04..7362996cf7c978ecf38d188911062dee8008d0cc 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_ghost_parameters.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_ghost_parameters.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; void function(int a, int b, int c, int d) diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_goto.c b/src/plugins/e-acsl/tests/memory/oracle/gen_goto.c index eba9ac175c142a5bf8338ff1a562811f554c5d5a..43911e961b2f1153ff56d75ca6c4d41fdba4e940 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_goto.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_goto.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; char a; @@ -30,10 +34,8 @@ int main(void) __e_acsl_globals_init(); __e_acsl_store_block((void *)(& b),(size_t)8); goto _LOR; - _LOR: { - __e_acsl_full_init((void *)(& b)); - b = & a; - } + _LOR: __e_acsl_full_init((void *)(& b)); + b = & a; if (a) goto _LOR; { int __gen_e_acsl_initialized; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_hidden_malloc.c b/src/plugins/e-acsl/tests/memory/oracle/gen_hidden_malloc.c index a8a13901088dfb79d1d6d213a1907c7bd2005f26..35dffbd04896b7aaa6ec0dab069aa704236f387e 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_hidden_malloc.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_hidden_malloc.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_init.c b/src/plugins/e-acsl/tests/memory/oracle/gen_init.c index a54a7cb5046195058f9e963c599daf50935e1640..6308414506af7e0306eb11e2d7ca5d37dba43b0c 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_init.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_init.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int a = 0; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_init_function.c b/src/plugins/e-acsl/tests/memory/oracle/gen_init_function.c index 880bc1dfb8a94282fbe3fc2d71361134561e51d1..591da5b061cf4848f1808db0c66622383b558cca 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_init_function.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_init_function.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; extern size_t __e_acsl_heap_allocation_size; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_initialized.c b/src/plugins/e-acsl/tests/memory/oracle/gen_initialized.c index d23f7f12d6f191683068913676034611820d0c4a..b05d785e73123996595271f6620c38b27f60b93a 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_initialized.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_initialized.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int A = 0; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_literal_string.c b/src/plugins/e-acsl/tests/memory/oracle/gen_literal_string.c index ebc970b778966423e388bd7ef86701c356527b9d..ae25b453493ac39d0a9689444aacdd4ee7ba9782 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_literal_string.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_literal_string.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string_6; char *__gen_e_acsl_literal_string_5; char *__gen_e_acsl_literal_string; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_local_goto.c b/src/plugins/e-acsl/tests/memory/oracle/gen_local_goto.c index de4df63dec0ccadb98c066189e4874522e46e61f..a47a436f538ce97b3fb401db0baac5bcba4860ba 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_local_goto.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_local_goto.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string_2; char *__gen_e_acsl_literal_string_3; char *__gen_e_acsl_literal_string; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_local_init.c b/src/plugins/e-acsl/tests/memory/oracle/gen_local_init.c index e4fcabd2ea5912c918a6765eb6b26604a116c0d2..e43ee1e33737e5409c7718cc8d432d9388befe09 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_local_init.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_local_init.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int X = 0; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_local_var.c b/src/plugins/e-acsl/tests/memory/oracle/gen_local_var.c index 3440b1add1e11a71bf36c1def418870bddd476ec..d97bdb41c923b4646f7c343eea7cc64300320e05 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_local_var.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_local_var.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct list { diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_mainargs.c b/src/plugins/e-acsl/tests/memory/oracle/gen_mainargs.c index d956cbad0de72e75f1bf9ce3aa2c4b8e4987a580..18836d02090e3ed43878b3e6658f52230952c198 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_mainargs.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_mainargs.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "string.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ requires valid_string_s: valid_read_string(s); diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_memalign.c b/src/plugins/e-acsl/tests/memory/oracle/gen_memalign.c index 81b3575082e73a74fce1e6461182075e7ba983f0..4b9a6d6578bc17ec454d1f67a8d108dca76774ae 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_memalign.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_memalign.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ requires valid_memptr: \valid(memptr); diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_memsize.c b/src/plugins/e-acsl/tests/memory/oracle/gen_memsize.c index 994842f8c25ae33a5defc42ce343f0c5e4156d1f..2606de54e2ffcb3359ab934c37a3d4d1f91db566 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_memsize.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_memsize.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; extern size_t __e_acsl_heap_allocation_size; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_null.c b/src/plugins/e-acsl/tests/memory/oracle/gen_null.c index 8824c15c741c97deb9ae0cd85a3e73a2f5d049d0..82e8b5fdfd15f1ff30898c1ff7c8edb923f7c17f 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_null.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_null.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_offset.c b/src/plugins/e-acsl/tests/memory/oracle/gen_offset.c index 704dbef0c4ffb46f5aff16a83dd2c7c8bad64352..e9beecbd3c95aca3ead09c0b1426f75e98689053 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_offset.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_offset.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int A[4] = {1, 2, 3, 4}; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_other_constants.c b/src/plugins/e-acsl/tests/memory/oracle/gen_other_constants.c index 0f68f8c4330e22e07552f893bc4aa83a0f1b3bf8..c5904316438e9ec40456ac4e8dd192718084f4ba 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_other_constants.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_other_constants.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; enum bool { diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_ptr.c b/src/plugins/e-acsl/tests/memory/oracle/gen_ptr.c index 72a552541a86f7239d25321a1a9c511c33028bbf..88bda500b3e1c2448c69bc0fb927b66dbeda92b1 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_ptr.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_ptr.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_ptr_init.c b/src/plugins/e-acsl/tests/memory/oracle/gen_ptr_init.c index 8d434a9df778e6701cbd8df21032ec754761e740..1c2481f7de89e62112967d385a344d64e791308e 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_ptr_init.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_ptr_init.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int *A; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_ranges_in_builtins.c b/src/plugins/e-acsl/tests/memory/oracle/gen_ranges_in_builtins.c index 1a5d1da6c6564a7f9e1e654ec3017acf27e0d9d2..24930091b451c17297a6433781c9e213d80d0f6c 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_ranges_in_builtins.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_ranges_in_builtins.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct S { diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_separated.c b/src/plugins/e-acsl/tests/memory/oracle/gen_separated.c index 1718fd24ec9ff9bd21079ef9a164ee1bae82c5b1..27fd719fed1f34145dc7be731006e1a8b9458485 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_separated.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_separated.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_sizeof.c b/src/plugins/e-acsl/tests/memory/oracle/gen_sizeof.c index 9e4230444a46b311e308b176a06d4fbde5337094..37e4dc882f8117a1c4862da80fe14c07e3c25588 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_sizeof.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_sizeof.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_stdout.c b/src/plugins/e-acsl/tests/memory/oracle/gen_stdout.c index 2342a478e692db320ff28082626d3b88e4b289de..e29b8a1da4ea50d08fb3c8be4917cb49d8b0b785 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_stdout.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_stdout.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; void __e_acsl_globals_init(void) diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_struct_initialized.c b/src/plugins/e-acsl/tests/memory/oracle/gen_struct_initialized.c index 5aa2e2c11740db73486728e7413c4e3412ada1bd..e67707de2733cd8454d2738b73b85d0d5e070762 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_struct_initialized.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_struct_initialized.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct __anonstruct_int32_pair_t_1 { diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_valid.c b/src/plugins/e-acsl/tests/memory/oracle/gen_valid.c index 08fd4c5ea6e47f520b117f23ae05c5bf2ad0d10a..bda841adb2e2f5ce53e30232358472d1a60c9559 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_valid.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_valid.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int *X; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_valid_alias.c b/src/plugins/e-acsl/tests/memory/oracle/gen_valid_alias.c index 225f60aa8251d6c2b16c2aa5ed43792044e36309..a811107fd53e2e84aaa519acf560fdcda3b56711 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_valid_alias.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_valid_alias.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_valid_in_contract.c b/src/plugins/e-acsl/tests/memory/oracle/gen_valid_in_contract.c index 7aa2a85c79fcf769f1967576b547f050f74e9363..3f991258a7a5a788b0ab392aa773b26737cfd379 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_valid_in_contract.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_valid_in_contract.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct list { @@ -37,11 +41,9 @@ struct list *f(struct list *l) __e_acsl_full_init((void *)(& __retres)); __retres = (struct list *)0; return_label: - { - __e_acsl_delete_block((void *)(& l)); - __e_acsl_delete_block((void *)(& __retres)); - return __retres; - } + __e_acsl_delete_block((void *)(& l)); + __e_acsl_delete_block((void *)(& __retres)); + return __retres; } int main(void) diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_vdso.c b/src/plugins/e-acsl/tests/memory/oracle/gen_vdso.c index 66ea297b9ededbe51075f170a634f2ea3f94e919..d5cddaab78c0d75871ebb9b51ea91d44b38bb3df 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_vdso.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_vdso.c @@ -1,4 +1,6 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" #include "signal.h" #include "stddef.h" #include "stdint.h" diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_vector.c b/src/plugins/e-acsl/tests/memory/oracle/gen_vector.c index 6b1c93bdc97665eda98f187936bb025b89a2bc78..72e722866d20994d6d790e981a9d9d94a5c512b7 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_vector.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_vector.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int LAST; diff --git a/src/plugins/e-acsl/tests/memory/oracle/gen_vla.c b/src/plugins/e-acsl/tests/memory/oracle/gen_vla.c index 224655e398d5ca1063bbba0c79423d5151a9ab54..38a7638daba3787939cdf71d48a73b12670ad300 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/gen_vla.c +++ b/src/plugins/e-acsl/tests/memory/oracle/gen_vla.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int LEN = 10; diff --git a/src/plugins/e-acsl/tests/special/oracle/gen_builtin.c b/src/plugins/e-acsl/tests/special/oracle/gen_builtin.c index 37d7d408bdfa2a4bc565d956e44be5360778a603..776ea8b6524aa46b325a93ab9b127344c16a2d0f 100644 --- a/src/plugins/e-acsl/tests/special/oracle/gen_builtin.c +++ b/src/plugins/e-acsl/tests/special/oracle/gen_builtin.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int incr(int x); diff --git a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-bittree-model.c b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-bittree-model.c index f2d5fd7585bba22c9fa4e4c3ab46dd63569bc0b0..6b84d67b8d384b16e15ef215e382d44a201dcb38 100644 --- a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-bittree-model.c +++ b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-bittree-model.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-compile-dlmalloc.c b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-compile-dlmalloc.c index a19e43d58079ff4d5cff6d21d57aca2e68656d7a..aa3403298643ea8c45f3147c955e6cb47397d915 100644 --- a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-compile-dlmalloc.c +++ b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-compile-dlmalloc.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-external-print-value.c b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-external-print-value.c index 51f27fe28b569c40b2b631a6d075582e93d63ffa..0853a5bd2395f6de975eaddd1dd2b0caa7eae509 100644 --- a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-external-print-value.c +++ b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-external-print-value.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-functions.c b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-functions.c index eeec7935ffac97fca07fd82b9d35944086706be6..b3c766498c673e1ff8f2900299ff777e5aebaded 100644 --- a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-functions.c +++ b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-functions.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ requires \initialized(p); diff --git a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-instrument.c b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-instrument.c index a07bc8387f58cca117e4c83f0eb61286b5a151b6..7067ee1a95c1879484960ab054cd41e692106887 100644 --- a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-instrument.c +++ b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-instrument.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stdarg.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int __gen_e_acsl_uninstrument1(int *p); diff --git a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-no-assert-print-data.c b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-no-assert-print-data.c index f3976124619edc3944e49c01e9b94c722eecaf9a..9c8f845614fc8b755ef89cc620bc8d1082eaca1b 100644 --- a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-no-assert-print-data.c +++ b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-no-assert-print-data.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-rt-debug.c b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-rt-debug.c index a19e43d58079ff4d5cff6d21d57aca2e68656d7a..aa3403298643ea8c45f3147c955e6cb47397d915 100644 --- a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-rt-debug.c +++ b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-rt-debug.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-segment-model.c b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-segment-model.c index f2d5fd7585bba22c9fa4e4c3ab46dd63569bc0b0..6b84d67b8d384b16e15ef215e382d44a201dcb38 100644 --- a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-segment-model.c +++ b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-segment-model.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-valid.c b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-valid.c index 980b041276a5e48b92aa95571710b795fdb2eea3..9dc6068e7e4164ce9b54323ea632104cf5aca96b 100644 --- a/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-valid.c +++ b/src/plugins/e-acsl/tests/special/oracle/gen_e-acsl-valid.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ requires \valid(y); diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_addr-by-val.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_addr-by-val.c index dfc3a961e287759cb75665bcf1d12a5be972ccf2..a8e259432fa3dc37ab9c9ef75ca179b0e92b3534 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_addr-by-val.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_addr-by-val.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(int argc, char **argv) diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_args.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_args.c index 37e9e4dcefe982f461b0f54e9fb2c644def0ac33..b11ba3e4f62390cc8337dc01caca723a0ad68501 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_args.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_args.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(int argc, char const **argv) diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_array.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_array.c index 5d43657c4b232969d853294382277c9c137e61aa..fb56df41d34181662f58e8699f6cd3b5e7c601da 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_array.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_array.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_char.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_char.c index be32b67475008187b30b3321a2362046c22b9e50..9e82a6eae3dc07a86dc360b8328131d15fab5f88 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_char.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_char.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(int argc, char const **argv) diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_darray.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_darray.c index 1b7f093625b1a1e30bb7117a7e60d2c955bad987..5fcb2978a3fec9d5507530b2344c680a2b0dfe7e 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_darray.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_darray.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; void area_triangle(double (*vertices)[4]) diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_dpointer.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_dpointer.c index 360f59711c7380ef8c00f0b908276aec9d072568..fa7c748107ff5515dffe8389ca2bbc594fea1236 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_dpointer.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_dpointer.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_fptr.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_fptr.c index 5ad3c1dc8c1e0d3ea3a0a280f7c7edd01e9749c8..bbf3854ccad1dca1e33343cd32ece060c46212e1 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_fptr.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_fptr.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int *foo(int *p) diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_fun_lib.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_fun_lib.c index a1471158a9d2a95245e53ec4a52e24bc1dec6a97..bd44e353e0ebb4f962c0bf184ed4c7c53099bb2f 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_fun_lib.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_fun_lib.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_fun_ptr.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_fun_ptr.c index 1d5e2f177e427f6ce8ff5a8ef1fdcbc0872f6859..c0c6e534d7797de3274190bd581bc25377cba148 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_fun_ptr.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_fun_ptr.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int *pfun(char c, int *p, int *p2, int *p3, int *p4, int i) diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_getenv.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_getenv.c index 726804ae1d7ac13c0605f6090219174a6f0f5ee3..00fea65e2cf393b47a15c38c5085376cc86bba86 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_getenv.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_getenv.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" char *__gen_e_acsl_literal_string_2; char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_global_init.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_global_init.c index 9183f6cf443ec572aa83c4f85badf8d1466d8453..9e71a59519afbea4e40820b1bb3cb83942460d03 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_global_init.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_global_init.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string; char *__gen_e_acsl_literal_string_2; char *__gen_e_acsl_literal_string_4; diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_labels.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_labels.c index 7863b0459679b5ce23d62dd5321a2f63ff81f6f6..75e427d2eeaff03f9470651e7a4d92d23f338a90 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_labels.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_labels.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; void foo(int *a, int *b) @@ -45,7 +49,8 @@ int main(int argc, char const **argv) __e_acsl_temporal_store_nblock((void *)(& q),(void *)(& b)); __e_acsl_store_block((void *)(& q),(size_t)8); __e_acsl_full_init((void *)(& q)); - LAB: __e_acsl_temporal_reset_parameters(); + LAB: + __e_acsl_temporal_reset_parameters(); __e_acsl_temporal_reset_return(); __e_acsl_temporal_save_nreferent_parameter((void *)(& p),0U); __e_acsl_temporal_save_nreferent_parameter((void *)(& q),1U); @@ -114,8 +119,9 @@ int main(int argc, char const **argv) __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } /*@ assert \valid(p) && \valid(q); */ ; + LAB2: __e_acsl_full_init((void *)(& q)); - LAB2: __e_acsl_temporal_store_nreferent((void *)(& q),(void *)(& p)); + __e_acsl_temporal_store_nreferent((void *)(& q),(void *)(& p)); q = p; { int __gen_e_acsl_initialized_3; diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_lit_string.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_lit_string.c index 813721499f3d5ba3b09a11c387f8dfe443fdd2d3..aaeea91f44d2915a408278bb88ed29039ad941f3 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_lit_string.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_lit_string.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string_2; char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_local_init.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_local_init.c index 6ac1c93184f9c40a1e5d217f58d5caa3b90bd83b..74d0ba3d7ff5b901ea616516a4d31fbafdc47e6f 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_local_init.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_local_init.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" char *__gen_e_acsl_literal_string_4; char *__gen_e_acsl_literal_string_3; char *__gen_e_acsl_literal_string; diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_malloc-asan.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_malloc-asan.c index 1b61d34bc77ef5bdc4971b63294a84f20aabfbc6..f34fde6988dfda415a3af91bc4e697164179c946 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_malloc-asan.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_malloc-asan.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" char *__gen_e_acsl_literal_string; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_malloc.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_malloc.c index 902e9ae9e47d2704458e6f6237b29406c4d3a310..ae85b5ecc53086d34d4a80a7ada3a47984cd627e 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_malloc.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_malloc.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_memcpy.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_memcpy.c index 61af3c3d703de655f0c7ef02f7dc5aeda7ec7931..305b7cb7986faa50698904aa10675661ee011fb1 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_memcpy.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_memcpy.c @@ -1,9 +1,13 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" #include "string.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; /*@ requires valid_dest: valid_or_empty(dest, n); diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_scope.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_scope.c index 179a76479102ac39fd6b1d1bdb62baf3286cf951..0579f052c644c4c526cc1288b157b7fca7e19a94 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_scope.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_scope.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_struct.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_struct.c index 51335c5b361572b9c56dc926865a30e5e9acf4fc..cedbfbcdb2ad988e042ef474099d07db5f33c155 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_struct.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_struct.c @@ -1,8 +1,12 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; struct temporal_t { diff --git a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_while.c b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_while.c index b53b4c6d33052c553ef153e4adab5b67d8d56df6..5a074dd5307ff4a830c5c81122daaebb296163bc 100644 --- a/src/plugins/e-acsl/tests/temporal/oracle/gen_t_while.c +++ b/src/plugins/e-acsl/tests/temporal/oracle/gen_t_while.c @@ -1,7 +1,11 @@ /* Generated by Frama-C */ +#include "pthread.h" +#include "sched.h" +#include "signal.h" #include "stddef.h" #include "stdint.h" #include "stdio.h" +#include "time.h" extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; int main(void) @@ -104,7 +108,8 @@ int main(void) } /*@ assert !\valid(q); */ ; __retres = 0; - return_label: __e_acsl_store_block_duplicate((void *)(& q),(size_t)8); + return_label: + __e_acsl_store_block_duplicate((void *)(& q),(size_t)8); __e_acsl_delete_block((void *)(& q)); __e_acsl_delete_block((void *)(arr)); __e_acsl_memory_clean(); diff --git a/src/plugins/from/from_compute.ml b/src/plugins/from/from_compute.ml index c28f33766a4107d7df9bdea8d498c8d166d60740..fe9417bc98ee3b8fd09979bdbb19b51a40f219b9 100644 --- a/src/plugins/from/from_compute.ml +++ b/src/plugins/from/from_compute.ml @@ -40,7 +40,6 @@ let rec find_deps_no_transitivity state expr = (* The value of the expression [expr], just before executing the statement [instr], is a function of the values of the returned zones. *) match expr.enode with - | Info (e, _) -> find_deps_no_transitivity state e | AlignOfE _| AlignOf _| SizeOfStr _ |SizeOfE _| SizeOf _ | Const _ -> Function_Froms.Deps.bottom | AddrOf lv | StartOf lv -> diff --git a/src/plugins/gui/design.ml b/src/plugins/gui/design.ml index 67843ca710078d81b47a8ae81d7a0b9d91ca2586..9df256c4c555e0d25da6204a03c27bafbd48e06f 100644 --- a/src/plugins/gui/design.ml +++ b/src/plugins/gui/design.ml @@ -862,7 +862,14 @@ class main_window () : main_window_extension_points = let () = main_window#set_default_size ~width ~height in let () = main_window#set_geometry_hints ~min_size:(1,1) main_window#coerce in let watch_cursor = Gdk.Cursor.create `WATCH in - let arrow_cursor = Gdk.Cursor.create `ARROW in + (* NOTE: the ARROW cursor is not available under some specific configurations, + e.g. WSLg + lablgtk3 + Wayland; so we avoid using it here. + Testing indicates only the following cursors are available: + BOTTOM_LEFT_CORNER, BOTTOM_RIGHT_CORNER, BOTTOM_SIDE, CROSSHAIR, HAND1, + LEFT_PTR, LEFT_SIDE, RIGHT_SIDE, TOP_LEFT_CORNER, TOP_RIGHT_CORNER, + TOP_SIDE, WATCH, XTERM + *) + let arrow_cursor = Gdk.Cursor.create `LEFT_PTR in (* On top one finds the menubar *) let toplevel_vbox = GPack.box `VERTICAL ~packing:main_window#add () in diff --git a/src/plugins/gui/project_manager.ml b/src/plugins/gui/project_manager.ml index f339fda9d370e3cd56b1e211cc4d7f8e74ca299d..aec5c7187089642aa12c8f5bb28ada52c6cb2db0 100644 --- a/src/plugins/gui/project_manager.ml +++ b/src/plugins/gui/project_manager.ml @@ -140,7 +140,7 @@ let load_project (host_window: Design.main_window_extension_points) = dialog#destroy () let mk_project_markup p = - let name = Project.get_unique_name p in + let name = Extlib.html_escape (Project.get_unique_name p) in if Project.is_current p then "<b>" ^ name ^ "</b>" else name let reset ?filter (menu: GMenu.menu) = diff --git a/src/plugins/gui/widget.ml b/src/plugins/gui/widget.ml index 011a7587d25c304c39598f5352829a4aced8aecd..fdec28d50e0c2323b2aa40f37cf185b1d44a9aab 100644 --- a/src/plugins/gui/widget.ml +++ b/src/plugins/gui/widget.ml @@ -211,6 +211,7 @@ class checkbox ~label ?tooltip () = inherit [bool] selector false as s inherit! gobj_action button as b method! set_enabled e = s#set_enabled e ; b#set_enabled e + method set_label l = button#set_label l method! set a = s#set a ; button#set_active a initializer begin diff --git a/src/plugins/gui/widget.mli b/src/plugins/gui/widget.mli index e208ca117ead4812fb75cb93cfdd545a03f2d52c..1a93c68e7af2934c4311e8ad16908ad5d6829386 100644 --- a/src/plugins/gui/widget.mli +++ b/src/plugins/gui/widget.mli @@ -130,6 +130,7 @@ class checkbox : label:string -> ?tooltip:string -> unit -> object inherit action inherit [bool] selector + method set_label : string -> unit end class switch : ?tooltip:string -> unit -> diff --git a/src/plugins/loop_analysis/loop_analysis.ml b/src/plugins/loop_analysis/loop_analysis.ml index 5c9705cb34e549d92a18a80ca50f77b53ef328c6..39a8827dd6a6ccf49727ac1b7cdb7a18c4d32dde 100644 --- a/src/plugins/loop_analysis/loop_analysis.ml +++ b/src/plugins/loop_analysis/loop_analysis.ml @@ -153,8 +153,6 @@ module Binary(* :BINARY_SEMILATTICE *) = struct | BinOp(MinusA,e1,e2,_) -> add (transfer_exp e1 load) (neg (transfer_exp e2 load)) | CastE(_,e) -> transfer_exp e load - (* | BinOp((PlusPI|IndexPI|MinusA),_,_,_) -> assert false *) - (* | BinOp(_,_,_,_) -> Unknown *) | _ -> (match Cil.constFoldToInt ~machdep:true exp with | None -> Unknown diff --git a/src/plugins/markdown-report/tests/sarif/oracle/std_string.sarif b/src/plugins/markdown-report/tests/sarif/oracle/std_string.sarif index 368f8a6a14c148a88cbac457eacfca39290dbd12..082afbda18776b2de0c6bf6a07fb35946c5bf370 100644 --- a/src/plugins/markdown-report/tests/sarif/oracle/std_string.sarif +++ b/src/plugins/markdown-report/tests/sarif/oracle/std_string.sarif @@ -11276,9 +11276,9 @@ "uriBaseId": "FRAMAC_SHARE" }, "region": { - "startLine": 700, + "startLine": 701, "startColumn": 11, - "endLine": 700, + "endLine": 701, "endColumn": 18, "byteLength": 7 } @@ -11309,6 +11309,29 @@ } ] }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { "text": "template_len." }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/stdlib.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 695, + "startColumn": 25, + "endLine": 695, + "endColumn": 45, + "byteLength": 20 + } + } + } + ] + }, { "ruleId": "user-spec", "kind": "pass", @@ -11322,9 +11345,9 @@ "uriBaseId": "FRAMAC_SHARE" }, "region": { - "startLine": 697, + "startLine": 698, "startColumn": 36, - "endLine": 698, + "endLine": 699, "endColumn": 53, "byteLength": 70 } @@ -11345,9 +11368,9 @@ "uriBaseId": "FRAMAC_SHARE" }, "region": { - "startLine": 695, + "startLine": 696, "startColumn": 10, - "endLine": 695, + "endLine": 696, "endColumn": 22, "byteLength": 12 } @@ -11371,9 +11394,9 @@ "uriBaseId": "FRAMAC_SHARE" }, "region": { - "startLine": 695, + "startLine": 696, "startColumn": 10, - "endLine": 695, + "endLine": 696, "endColumn": 22, "byteLength": 12 } @@ -11396,9 +11419,198 @@ "uriBaseId": "FRAMAC_SHARE" }, "region": { - "startLine": 696, + "startLine": 697, "startColumn": 10, - "endLine": 696, + "endLine": 697, + "endColumn": 17, + "byteLength": 7 + } + } + } + ] + }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { "text": "behavior default! in function mkstemps." }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/stdlib.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 714, + "startColumn": 11, + "endLine": 714, + "endColumn": 19, + "byteLength": 8 + } + } + } + ] + }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { "text": "valid_template." }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/stdlib.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 706, + "startColumn": 27, + "endLine": 706, + "endColumn": 48, + "byteLength": 21 + } + } + } + ] + }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { "text": "template_len." }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/stdlib.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 707, + "startColumn": 25, + "endLine": 707, + "endColumn": 57, + "byteLength": 32 + } + } + } + ] + }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { "text": "non_negative_suffixlen." }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/stdlib.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 708, + "startColumn": 35, + "endLine": 708, + "endColumn": 49, + "byteLength": 14 + } + } + } + ] + }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { "text": "result_error_or_valid_fd." }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/stdlib.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 711, + "startColumn": 36, + "endLine": 712, + "endColumn": 53, + "byteLength": 70 + } + } + } + ] + }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { "text": "assigns clause in function mkstemps." }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/stdlib.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 709, + "startColumn": 10, + "endLine": 709, + "endColumn": 22, + "byteLength": 12 + } + } + } + ] + }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { + "text": + "from clause of term *(templat + (0 ..)) in function mkstemps." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/stdlib.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 709, + "startColumn": 10, + "endLine": 709, + "endColumn": 22, + "byteLength": 12 + } + } + } + ] + }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { + "text": "from clause of term \\result in function mkstemps." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/stdlib.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 710, + "startColumn": 10, + "endLine": 710, "endColumn": 17, "byteLength": 7 } diff --git a/src/plugins/obfuscator/obfuscate.ml b/src/plugins/obfuscator/obfuscate.ml index 29ac575f1351bd484af3c203a4d113f82da83507..ce98d74285882c360f909fe8a7951d699b74ae68 100644 --- a/src/plugins/obfuscator/obfuscate.ml +++ b/src/plugins/obfuscator/obfuscate.ml @@ -166,12 +166,13 @@ class visitor = object Cil.DoChildren method! vannotation = function - | Daxiomatic(str, _, _, _) -> - warn "axiomatic" str; - Cil.DoChildren - | Dlemma(str, _, _, { tp_kind }, _, _) -> - warn (Cil_printer.string_of_lemma tp_kind) str; - Cil.DoChildren + | Daxiomatic(str, globs, attrs, loc) -> + let str' = Dictionary.fresh Obfuscator_kind.Axiomatic str in + Cil.ChangeDoChildrenPost(Daxiomatic(str',globs,attrs,loc),Extlib.id) + | Dlemma(str, labs, typs, pred, attrs, loc) -> + let str' = Dictionary.fresh Obfuscator_kind.Lemma str in + Cil.ChangeDoChildrenPost( + Dlemma(str',labs,typs, pred, attrs, loc),Extlib.id) | _ -> Cil.DoChildren @@ -290,7 +291,7 @@ end let obfuscate () = Dictionary.mark_as_computed (); obfuscate_behaviors (); - Visitor.visitFramacFileSameGlobals + Visitor.visitFramacFile (new visitor :> Visitor.frama_c_visitor) (Ast.get ()); Printer.update_printer (module UpdatePrinter: Printer.PrinterExtension) diff --git a/src/plugins/obfuscator/obfuscator_kind.ml b/src/plugins/obfuscator/obfuscator_kind.ml index e1f1513784abd71faf1fb5af430a702c31b49a48..1e5c410045b8fd8c67c8c95098d316f57969e921 100644 --- a/src/plugins/obfuscator/obfuscator_kind.ml +++ b/src/plugins/obfuscator/obfuscator_kind.ml @@ -36,6 +36,8 @@ type k = | Type | Logic_type | Logic_constructor + | Axiomatic + | Lemma let name_of_kind = function | Behavior -> "behavior" @@ -53,6 +55,8 @@ let name_of_kind = function | Type -> "type" | Logic_type -> "logic type" | Logic_constructor -> "logic constructor" + | Axiomatic -> "axiomatic" + | Lemma -> "lemma" let prefix = function | Behavior -> "B" @@ -70,6 +74,8 @@ let prefix = function | Type -> "T" | Logic_type -> "LT" | Logic_constructor -> "LC" + | Axiomatic -> "A" + | Lemma -> "LE" include Datatype.Make_with_collections (struct diff --git a/src/plugins/obfuscator/obfuscator_kind.mli b/src/plugins/obfuscator/obfuscator_kind.mli index 75fd6bb8af5a3a00662520b265423f5bbab6a2e2..8eee3ce7ad4b63c5894a2fc93f257f1dfce7d219 100644 --- a/src/plugins/obfuscator/obfuscator_kind.mli +++ b/src/plugins/obfuscator/obfuscator_kind.mli @@ -36,6 +36,8 @@ type k = | Type | Logic_type | Logic_constructor + | Axiomatic + | Lemma include Datatype.S_with_collections with type t = k val prefix: t -> string diff --git a/src/plugins/qed/Makefile b/src/plugins/qed/Makefile index fb2350efe6e9561f0bcbe3c3803c7b266b8bda09..fd4255b62dc97a0a5e7f454b222fe3feb96377f6 100644 --- a/src/plugins/qed/Makefile +++ b/src/plugins/qed/Makefile @@ -54,9 +54,8 @@ PLUGIN_CMO:= \ pool kind term \ plib pretty export \ export_whycore \ - export_altergo \ export_why3 \ - export_coq \ + PLUGIN_CMI:= logic engine @@ -67,7 +66,7 @@ PLUGIN_OFLAGS:= PLUGIN_GENERATED:= $(PLUGIN_DIR)/Qed.mli PLUGIN_DISTRIBUTED:=$(PLUGIN_ENABLED) -PLUGIN_DISTRIB_EXTERNAL:= Makefile +PLUGIN_DISTRIB_EXTERNAL:= Makefile include $(FRAMAC_SHARE)/Makefile.dynamic @@ -87,9 +86,7 @@ QED_API= \ pool.mli kind.mli term.mli \ plib.mli pretty.mli engine.mli export.mli \ export_whycore.mli \ - export_altergo.mli \ export_why3.mli \ - export_coq.mli \ QED_MLI=$(addprefix $(Qed_DIR)/, $(QED_API)) diff --git a/src/plugins/qed/engine.ml b/src/plugins/qed/engine.ml index 8dfe55ff244431299fb0f628acd5bf17cfc04cea..6b8853be1de09f4275efead0523576a25278d31b 100644 --- a/src/plugins/qed/engine.ml +++ b/src/plugins/qed/engine.ml @@ -36,7 +36,9 @@ type op = type link = | F_call of string (** n-ary function *) - | F_subst of string (** n-ary function with substitution "foo(%1,%2)" *) + | F_subst of string * string (** n-ary function with substitution + first value is the link name, second is the + substitution (e.g. "foo(%1,%2)") *) | F_left of string (** 2-ary function left-to-right + *) | F_right of string (** 2-ary function right-to-left + *) | F_list of string * string (** n-ary function with (cons,nil) constructors *) diff --git a/src/plugins/qed/export.ml b/src/plugins/qed/export.ml index c1d37be39205f67ce351c45b0c892c3b08db3656..452b8b472cf64977202d7572ddd5fb92bec34420 100644 --- a/src/plugins/qed/export.ml +++ b/src/plugins/qed/export.ml @@ -65,7 +65,7 @@ let link_name = function let debug = function | F_call f | F_left f | F_right f | F_bool_prop(_,f) - | F_list(f,_) | F_subst f | F_assoc f -> f + | F_list(f,_) | F_subst (f, _) | F_assoc f -> f (* -------------------------------------------------------------------------- *) (* --- Identifiers --- *) @@ -451,7 +451,7 @@ struct fc self#pp_atom x (plist w) xs in plist (self#callstyle,fc,fn) fmt xs end - | F_subst s, _ -> + | F_subst (_, s), _ -> let print = match self#callstyle with | CallVar | CallVoid -> self#pp_flow | CallApply -> self#pp_atom in diff --git a/src/plugins/qed/export_altergo.ml b/src/plugins/qed/export_altergo.ml deleted file mode 100644 index d779b1f827c4600c0f33f77f5009e2a226aa9cc3..0000000000000000000000000000000000000000 --- a/src/plugins/qed/export_altergo.ml +++ /dev/null @@ -1,374 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Exportation Engine for Alt-Ergo --- *) -(* -------------------------------------------------------------------------- *) - -open Logic -open Format -open Plib -open Engine -open Export - -module Make(T : Term) = -struct - - open T - module E = Export_whycore.Make(T) - module Env = E.Env - module ADT = T.ADT - module Field = T.Field - module Fun = T.Fun - - type trigger = (T.var,Fun.t) ftrigger - type typedef = (tau,Field.t,Fun.t) Engine.ftypedef - - class virtual engine = - object(self) - - inherit E.engine - - (* -------------------------------------------------------------------------- *) - (* --- Types --- *) - (* -------------------------------------------------------------------------- *) - - method t_atomic (_:tau) = true - - method pp_array fmt data = - fprintf fmt "%a farray" self#pp_tau data - - method pp_farray fmt key data = - fprintf fmt "(%a,%a) farray" self#pp_tau key self#pp_tau data - - method virtual get_typedef : ADT.t -> tau option - method virtual set_typedef : ADT.t -> tau -> unit - - method pp_datatype adt fmt ts = - match self#get_typedef adt with - | Some def -> - let t = Kind.tmap (Array.of_list ts) def in - self#pp_tau fmt t - | None -> - match ts with - | [] -> pp_print_string fmt (self#datatype adt) - | [t] -> fprintf fmt "%a@ %s" self#pp_tau t (self#datatype adt) - | t::ts -> - fprintf fmt "@[<hov 2>(%a" self#pp_tau t ; - List.iter (fun t -> fprintf fmt ",@,%a" self#pp_tau t) ts ; - fprintf fmt ")@ %s@]" (self#datatype adt) - - (* -------------------------------------------------------------------------- *) - (* --- Primitives --- *) - (* -------------------------------------------------------------------------- *) - - method callstyle = CallVar - - method pp_array_cst fmt (key : tau) v = - try - let elt = T.typeof v in - let tau = Array(key,elt) in - fprintf fmt "@[<hov 2>(const(%a)@ : %a)@]" - self#pp_flow v self#pp_tau tau - with Not_found -> - fprintf fmt "const(%a)" self#pp_flow v - - (* -------------------------------------------------------------------------- *) - (* --- Arithmetics --- *) - (* -------------------------------------------------------------------------- *) - - method pp_int amode fmt z = match amode with - | Aint -> pp_print_string fmt (Z.to_string z) - | Areal -> fprintf fmt "%s.0" (Z.to_string z) - - method pp_real fmt r = - if Z.equal r.Q.den Z.one then - self#pp_int Areal fmt r.Q.num - else - fprintf fmt "(%a@ / %a)" - (self#pp_int Areal) r.Q.num - (self#pp_int Areal) r.Q.den - - method op_real_of_int = Call "real_of_int" - - method op_minus (_:amode) = Op "-" - method op_add (_:amode) = Assoc "+" - method op_sub (_:amode) = Assoc "-" - method op_mul (_:amode) = Assoc "*" - method op_div = function Aint -> Call "div" | Areal -> Op "/" - method op_mod = function Aint -> Call "mod" | Areal -> Call "rmod" - - method op_eq cmode _amode = - match cmode with - | Cprop -> Op "=" - | Cterm -> Call "eqb" - - method op_neq cmode _amode = - match cmode with - | Cprop -> Op "<>" - | Cterm -> Call "neqb" - - method op_lt cmode amode = - match cmode , amode with - | Cprop , _ -> Op "<" - | Cterm , Aint -> Call "zlt" - | Cterm , Areal -> Call "rlt" - - method op_leq cmode amode = - match cmode , amode with - | Cprop , _ -> Op "<=" - | Cterm , Aint -> Call "zleq" - | Cterm , Areal -> Call "rleq" - - (* -------------------------------------------------------------------------- *) - (* --- Logical Connectives --- *) - (* -------------------------------------------------------------------------- *) - - method e_true _ = "true" - method e_false _ = "false" - - method op_not = function Cprop -> Op "not" | Cterm -> Call "notb" - method op_and = function Cprop -> Assoc "and" | Cterm -> Call "andb" - method op_or = function Cprop -> Assoc "or" | Cterm -> Call "orb" - method op_imply = function Cprop -> Assoc "->" | Cterm -> Call "implb" - method op_equiv = function Cprop -> Op "<->" | Cterm -> Call "eqb" - - method op_equal = function Cprop -> Op "=" | Cterm -> Call "eqb" - method op_noteq = function Cprop -> Op "<>" | Cterm -> Call "neqb" - - (* -------------------------------------------------------------------------- *) - (* --- Conditional --- *) - (* -------------------------------------------------------------------------- *) - - method pp_conditional fmt a b c = - match Export.pmode self#mode with - | Negative -> - let cond = T.e_and [T.e_imply [a] b ; T.e_imply [T.e_not a] c] in - self#pp_flow fmt cond - | Positive -> - let cond = T.e_or [T.e_and [a;b] ; T.e_and [T.e_not a;c]] in - self#pp_flow fmt cond - | Boolean -> - begin - fprintf fmt "@[<hov 2>match_bool(" ; - self#with_mode Mterm (fun _ -> self#pp_atom fmt a) ; - fprintf fmt ",@ %a" self#pp_atom b ; - fprintf fmt ",@ %a" self#pp_atom c ; - fprintf fmt ")@]" ; - end - - (* -------------------------------------------------------------------------- *) - (* --- Records --- *) - (* -------------------------------------------------------------------------- *) - - method op_record = "{" , "}" - - (* -------------------------------------------------------------------------- *) - (* --- Atomicity --- *) - (* -------------------------------------------------------------------------- *) - - method op_spaced = is_identifier - method is_atomic e = - match T.repr e with - | Kint z -> Z.leq Z.zero z - | Kreal _ -> true - | Apply _ -> true - | Acst _ | Aset _ | Aget _ | Fun _ -> true - | _ -> T.is_simple e - - (* -------------------------------------------------------------------------- *) - (* --- Lets --- *) - (* -------------------------------------------------------------------------- *) - - method typeof e = T.typeof e - - val mutable quantify_let = false - method set_quantify_let e = quantify_let <- e - - method pp_let fmt pmode x e = - try - let tau = self#typeof e in - match pmode with - | Positive when quantify_let -> - fprintf fmt "@[<hov 4>forall %s : %a. %s = %a ->@]@ " - x self#pp_tau tau x self#pp_flow e - | Negative when quantify_let -> - fprintf fmt "@[<hov 4>exists %s : %a. %s = %a and@]@ " - x self#pp_tau tau x self#pp_flow e - | _ -> - fprintf fmt "@[<hov 4>let %s = %a : %a in@]@ " - x self#pp_atom e self#pp_tau tau - with Not_found -> - fprintf fmt "@[<hov 4>let %s = %a in@]@ " - x self#pp_flow e - - (* -------------------------------------------------------------------------- *) - (* --- Binders --- *) - (* -------------------------------------------------------------------------- *) - - method pp_forall tau fmt = function - | [] -> () - | x::xs -> - fprintf fmt "@[<hov 2>forall %a" self#pp_var x ; - List.iter (fun x -> fprintf fmt ",@,%a" self#pp_var x) xs ; - fprintf fmt "@ : %a.@]" self#pp_tau tau ; - - method pp_intros tau fmt = function - | [] -> () - | x::xs -> - fprintf fmt "@[<hov 2>forall %a" self#pp_var x ; - List.iter (fun x -> fprintf fmt ",@,%a" self#pp_var x) xs ; - fprintf fmt "@ : %a@]" self#pp_tau tau ; - - method pp_exists tau fmt = function - | [] -> () - | x::xs -> - fprintf fmt "@[<hov 2>exists %a" self#pp_var x ; - List.iter (fun x -> fprintf fmt ",@,%a" self#pp_var x) xs ; - fprintf fmt "@ : %a.@]" self#pp_tau tau ; - - method pp_trigger fmt t = - let rec pretty fmt = function - | TgAny -> assert false - | TgVar x -> self#pp_var fmt (self#find x) - | TgGet(t,k) -> fprintf fmt "@[<hov 2>%a[%a]@]" pretty t pretty k - | TgSet(t,k,v) -> fprintf fmt "@[<hov 2>%a[%a@ <- %a]@]" pretty t pretty k pretty v - | TgFun(f,ts) -> call Cterm f fmt ts - | TgProp(f,ts) -> call Cprop f fmt ts - and call mode f fmt ts = - match self#link f, mode with - | F_call f, _ - | F_bool_prop (f,_), Cterm - | F_bool_prop (_,f), Cprop -> - Plib.pp_call_var ~f pretty fmt ts - | F_left f, _ -> Plib.pp_fold_call ~f pretty fmt ts - | F_right f, _ -> Plib.pp_fold_call_rev ~f pretty fmt (List.rev ts) - | F_assoc op, _ -> Plib.pp_assoc ~e:"?" ~op pretty fmt ts - | F_subst s, _ -> Plib.substitute_list pretty s fmt ts - | F_list(fc,fn) , _ -> - let rec plist fc fn fmt = function - | [] -> pp_print_string fmt fn - | x::xs -> - fprintf fmt "[<hov 2>%s(@,%a,@,%a)@]" fc - pretty x (plist fc fn) xs - in plist fc fn fmt ts - in fprintf fmt "@[<hov 2>%a@]" pretty t - - method pp_goal fmt p = self#pp_prop fmt p - - (* -------------------------------------------------------------------------- *) - (* --- Declarations --- *) - (* -------------------------------------------------------------------------- *) - - method pp_declare_adt fmt adt = function - | 0 -> fprintf fmt "type %s" (self#datatype adt) - | 1 -> fprintf fmt "type %a %s" self#pp_tvar 1 (self#datatype adt) - | n -> - begin - fprintf fmt "type (%a" self#pp_tvar 1 ; - for i=2 to n do fprintf fmt ",%a" self#pp_tvar i done ; - fprintf fmt ") %s" (self#datatype adt) ; - end - - method pp_declare_def fmt adt n def = - begin - fprintf fmt "(* @[<hov 4>inlined type " ; - self#pp_declare_adt fmt adt n ; - fprintf fmt "@ = %a@] *)" self#pp_tau def ; - self#set_typedef adt def ; - end - - method pp_declare_sum fmt adt n cases = - let is_enum = function (_,[]) -> true | _ -> false in - if List.for_all is_enum cases then - begin - fprintf fmt "@[<hov 4>" ; - self#pp_declare_adt fmt adt n ; - Plib.iteri - (fun index (c,_) -> match index with - | Ifirst | Isingle -> - fprintf fmt " = %s" (link_name (self#link c)) - | Imiddle | Ilast -> - fprintf fmt "@ | %s" (link_name (self#link c)) - ) cases ; - fprintf fmt "@]" - end - else - begin - self#pp_declare_adt fmt adt n ; - pp_print_newline fmt () ; - let result = Data(adt,Kind.type_params n) in - List.iter - (fun (c,ts) -> - self#declare_signature fmt c ts result - ) cases ; - let rank = "rank_" ^ self#datatype adt in - fprintf fmt "logic %s : %a -> int@\n" rank self#pp_tau result ; - Plib.iterk - (fun k (c,ts) -> - fprintf fmt "@[<hov 2>axiom %s_%d:@ " rank k ; - let xs = Plib.mapk - (fun k t -> - fprintf fmt "forall x%d:%a.@ " k self#pp_tau t ; - Printf.sprintf "x%d" k) ts - in - let f = link_name (self#link c) in - fprintf fmt "%s(%a)=%d@]@\n" rank - (Plib.pp_call_var ~f pp_print_string) - xs k - ) cases ; - end - - method declare_signature fmt f ts t = - begin - fprintf fmt "@[<hv 4>logic %s :@ " (link_name (self#link f)) ; - if ts <> [] then - begin - Plib.pp_listcompact ~sep:"," self#pp_tau fmt ts ; - fprintf fmt "@ -> " ; - end ; - fprintf fmt "%a@]@\n" self#pp_tau t - end - - method declare_definition fmt f xs t e = - self#global - begin fun () -> - let cmode = Export.ctau t in - fprintf fmt "@[<hv 4>%a@,(" (self#pp_declare_symbol cmode) f ; - Plib.pp_listsep ~sep:"," - (fun fmt x -> - let a = self#bind x in - let t = T.tau_of_var x in - fprintf fmt "%a:%a" self#pp_var a self#pp_tau t - ) fmt xs ; - match cmode with - | Cprop -> - fprintf fmt ") =@ @[<hov 0>%a@]@]@\n" - self#pp_prop e - | Cterm -> - fprintf fmt ") :@ %a =@ @[<hov 0>%a@]@]@\n" - self#pp_tau t (self#pp_expr t) e - end - - end - -end diff --git a/src/plugins/qed/export_altergo.mli b/src/plugins/qed/export_altergo.mli deleted file mode 100644 index ec036440e67261ec32333fa965bd1efd08584978..0000000000000000000000000000000000000000 --- a/src/plugins/qed/export_altergo.mli +++ /dev/null @@ -1,74 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -open Logic -open Format -open Plib -open Engine - -(** Exportation Engine for Alt-Ergo. - - Provides a full {{:Export.S.engine-c.html}engine} - from a {{:Export.S.linker-c.html}linker}. *) - -module Make(T : Term) : -sig - - open T - module Env : Engine.Env with type term := term - - type trigger = (T.var,Fun.t) Engine.ftrigger - type typedef = (tau,Field.t,Fun.t) Engine.ftypedef - - class virtual engine : - object - method set_quantify_let : bool -> unit - - method virtual get_typedef : ADT.t -> tau option - method virtual set_typedef : ADT.t -> tau -> unit - - method typeof : term -> tau (** Defaults to T.typeof *) - - inherit [Z.t,ADT.t,Field.t,Fun.t,tau,var,term,Env.t] Engine.engine - method marks : Env.t * T.marks - method op_spaced : string -> bool - method op_record : string * string - method pp_forall : tau -> string list printer - method pp_intros : tau -> string list printer - method pp_exists : tau -> string list printer - method pp_param : (string * tau) printer - method pp_trigger : (var,Fun.t) ftrigger printer - method pp_declare_symbol : cmode -> Fun.t printer - method pp_declare_adt : formatter -> ADT.t -> int -> unit - method pp_declare_def : formatter -> ADT.t -> int -> tau -> unit - method pp_declare_sum : formatter -> ADT.t -> int -> (Fun.t * tau list) list -> unit - method pp_goal : formatter -> term -> unit - - method declare_type : formatter -> ADT.t -> int -> typedef -> unit - method declare_prop : kind:string -> formatter -> string -> T.var list -> trigger list list -> term -> unit - method declare_axiom : formatter -> string -> var list -> trigger list list -> term -> unit - method declare_signature : formatter -> Fun.t -> tau list -> tau -> unit - method declare_definition : formatter -> Fun.t -> var list -> tau -> term -> unit - - end - -end diff --git a/src/plugins/qed/export_coq.ml b/src/plugins/qed/export_coq.ml deleted file mode 100644 index aa39074635d604c21455ec6561e9b7675bf43797..0000000000000000000000000000000000000000 --- a/src/plugins/qed/export_coq.ml +++ /dev/null @@ -1,378 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Exportation Engine for Coq --- *) -(* -------------------------------------------------------------------------- *) - -open Logic -open Format -open Plib -open Engine -open Export - -module Make(T : Term) = -struct - - module T = T - module E = Export.Make(T) - module Env = E.Env - - open T - - type tau = (Field.t,ADT.t) datatype - type trigger = (var,Fun.t) ftrigger - type typedef = (tau,Field.t,Fun.t) ftypedef - - class virtual engine = - object(self) - - inherit E.engine - - (* -------------------------------------------------------------------------- *) - (* --- Types --- *) - (* -------------------------------------------------------------------------- *) - - method t_int = "Z" - method t_real = "R" - method t_bool = "bool" - method t_prop = "Prop" - method t_atomic = function - | Int | Real | Bool | Prop | Tvar _ -> true - | Array _ -> false - | Data(_,[]) -> true - | Data _ -> false - | Record _ -> true - - method pp_array fmt t = - fprintf fmt "array %a" self#pp_subtau t - - method pp_farray fmt a b = - fprintf fmt "farray %a %a" self#pp_subtau a self#pp_subtau b - - method pp_tvar fmt k = - if 1 <= k && k <= 26 then - let c = int_of_char 'A' + (k-1) in - pp_print_char fmt (char_of_int c) - else - fprintf fmt "A%d" k - - method virtual datatype : T.ADT.t -> string - - method pp_datatype adt fmt = function - | [] -> pp_print_string fmt (self#datatype adt) - | ts -> Plib.pp_call_apply ~f:(self#datatype adt) self#pp_subtau fmt ts - - (* -------------------------------------------------------------------------- *) - (* --- Primitives --- *) - (* -------------------------------------------------------------------------- *) - - method callstyle = CallApply - method op_scope = function Aint -> Some "%Z" | Areal -> Some "%R" - - method pp_int _amode fmt z = pp_print_string fmt (Z.to_string z) - method pp_real fmt q = - fprintf fmt "( %s / %s )%%R" - (Z.to_string q.Q.num) - (Z.to_string q.Q.den) - - method e_true = function Cterm -> "true" | Cprop -> "True" - method e_false = function Cterm -> "false" | Cprop -> "False" - - (* -------------------------------------------------------------------------- *) - (* --- Arithmetics --- *) - (* -------------------------------------------------------------------------- *) - - method op_add (_:amode) = Assoc "+" - method op_sub (_:amode) = Assoc "-" - method op_mul (_:amode) = Assoc "*" - method op_div = function Aint -> Call "Cdiv" | Areal -> Call "Rdiv" - method op_mod = function Aint -> Call "Cmod" | Areal -> Call "Rmod" - method op_minus (_:amode) = Op "-" - method op_real_of_int = Call "IZR" - - method op_eq (c:cmode) (a:amode) = - match c , a with - | Cprop , _ -> Op "=" - | Cterm , Aint -> Call "Zeq_bool" - | Cterm , Areal -> Call "Req_bool" - - method op_neq (c:cmode) (a:amode) = - match c , a with - | Cprop , _ -> Op "<>" - | Cterm , Aint -> Call "Zneq_bool" - | Cterm , Areal -> Call "Rneq_bool" - - method op_lt (c:cmode) (a:amode) = - match c , a with - | Cprop , _ -> Op "<" - | Cterm , Aint -> Call "Zlt_bool" - | Cterm , Areal -> Call "Rlt_bool" - - method op_leq (c:cmode) (a:amode) = - match c , a with - | Cprop , _ -> Op "<=" - | Cterm , Aint -> Call "Zle_bool" - | Cterm , Areal -> Call "Rle_bool" - - (* -------------------------------------------------------------------------- *) - (* --- Connectives --- *) - (* -------------------------------------------------------------------------- *) - - method op_not = function Cterm -> Call "negb" | Cprop -> Op "~" - method op_or = function Cterm -> Call "orb" | Cprop -> Assoc "\\/" - method op_and = function Cterm -> Call "andb" | Cprop -> Assoc "/\\" - method op_imply = function Cterm -> Call "implb" | Cprop -> Assoc "->" - method op_equiv = function Cterm -> Call "eqb" | Cprop -> Op "<->" - method op_equal = function Cterm -> Call "Aeq_bool" | Cprop -> Op "=" - method op_noteq = function Cterm -> Call "Aneq_bool" | Cprop -> Op "<>" - - (* -------------------------------------------------------------------------- *) - (* --- Conditional --- *) - (* -------------------------------------------------------------------------- *) - - method pp_conditional fmt a b c = - match Export.pmode self#mode with - | Negative -> - begin - fprintf fmt "branch@ %a@ %a@ %a" - self#pp_atom a self#pp_atom b self#pp_atom c ; - end - | Positive -> - begin - fprintf fmt "itep@ %a@ %a@ %a" - self#pp_atom a self#pp_atom b self#pp_atom c ; - end - | Boolean -> - begin - fprintf fmt "@[<hov 0>if " ; - self#with_mode Mterm (fun _ -> self#pp_atom fmt a) ; - fprintf fmt "@ then %a" self#pp_atom b ; - fprintf fmt "@ else %a" self#pp_atom c ; - fprintf fmt "@]" ; - end - - (* -------------------------------------------------------------------------- *) - (* --- Arrays --- *) - (* -------------------------------------------------------------------------- *) - - method pp_array_cst fmt k v = - let pp_domain fmt v = - try self#pp_tau fmt (T.typeof v) - with Not_found -> pp_print_string fmt "_" - in - fprintf fmt "@[<hov 2>(const@ %a :@ farray@ %a@ %a)@]" - self#pp_atom v self#pp_tau k pp_domain v - - method pp_array_get fmt m k = - fprintf fmt "%a.[ %a ]" self#pp_atom m self#pp_flow k - - method pp_array_set fmt m k v = - fprintf fmt "%a.[ %a <- %a ]" self#pp_atom m self#pp_flow k self#pp_flow v - - (* -------------------------------------------------------------------------- *) - (* --- Records --- *) - (* -------------------------------------------------------------------------- *) - - method virtual field : T.Field.t -> string - - method pp_get_field fmt r f = - fprintf fmt "%s@ %a" (self#field f) self#pp_atom r - - method pp_def_fields fmt fvs = - begin - fprintf fmt "@[<hov 2>{|" ; - Plib.iteri - (fun i (f,v) -> match i with - | Ifirst | Imiddle -> - fprintf fmt "@ @[<hov 2>%s := %a ;@]" (self#field f) self#pp_flow v - | Isingle | Ilast -> - fprintf fmt "@[<hov 2>%s := %a@]" (self#field f) self#pp_flow v - ) fvs ; - fprintf fmt "@ |}@]" ; - end - - (* -------------------------------------------------------------------------- *) - (* --- Atomicity --- *) - (* -------------------------------------------------------------------------- *) - - method op_spaced = is_identifier - - method is_atomic e = - match T.repr e with - | Kint z -> Z.leq Z.zero z - | Kreal _ -> true - | Apply(_,[]) | Rdef _ -> true - | Apply _ | Acst _ | Aset _ | Aget _ | Rget _ -> false - | Eq _ | Neq _ | Lt _ | Leq _ - | And _ | Or _ | Imply _ | Bind _ | Fun _ | If _ -> false - | _ -> T.is_simple e - - method pp_let fmt (_:pmode) x e = - fprintf fmt "@[<hov 4>let %s := %a in@]@ " x self#pp_flow e - - (* -------------------------------------------------------------------------- *) - (* --- Higher Order --- *) - (* -------------------------------------------------------------------------- *) - - method pp_apply _cmode e fmt es = - begin - fprintf fmt "@[<hov 3>(%a" self#pp_atom e ; - List.iter (fun a -> fprintf fmt "@ %a" self#pp_atom a) es ; - fprintf fmt ")@]" - end - - method private pp_param fmt (x,t) = - fprintf fmt "(%a : %a)" self#pp_var x self#pp_tau t - - method pp_forall tau fmt = function - | [] -> () - | x::xs -> - fprintf fmt "@[<hov 2>forall (%a" self#pp_var x ; - List.iter (fun y -> fprintf fmt "@ %a" self#pp_var y) xs ; - fprintf fmt "@ : %a),@]" self#pp_tau tau - - method pp_exists tau fmt = function - | [] -> () - | x::xs -> - fprintf fmt "@[<hov 2>exists %a : %a@]," - self#pp_var x self#pp_tau tau ; - List.iter - (fun x -> - fprintf fmt "@ @[<hov 2>exists %a : %a@]," - self#pp_var x self#pp_tau tau) xs - - method pp_lambda fmt xs = - Plib.iteri - (fun i x -> match i with - | Isingle -> fprintf fmt "@[<hov 2>fun %a =>@]@ " self#pp_param x - | Ifirst -> fprintf fmt "@[<hov 2>fun %a" self#pp_param x - | Imiddle -> fprintf fmt "@ %a" self#pp_param x - | Ilast -> fprintf fmt "@ %a =>@]@ " self#pp_param x - ) xs - - (* -------------------------------------------------------------------------- *) - (* --- Declarations --- *) - (* -------------------------------------------------------------------------- *) - - method private pp_declare_poly fmt n = - if n > 0 then - begin - fprintf fmt " (" ; - for i=1 to n do fprintf fmt "%a " self#pp_tvar i done ; - fprintf fmt " : Type)" ; - end ; - - method declare_type fmt adt n = function - | Tabs -> - begin - fprintf fmt "Parameter %s" (self#datatype adt) ; - self#pp_declare_poly fmt n ; - fprintf fmt " : Type.@\n" - end - | Tdef def -> - begin - fprintf fmt "@[<hov 2>Definition %s" (self#datatype adt) ; - self#pp_declare_poly fmt n ; - fprintf fmt " : Type :=@ %a@].@\n" self#pp_tau def ; - end - | Trec fts -> - begin - fprintf fmt "@[<hv 0>Record %s" (self#datatype adt) ; - self#pp_declare_poly fmt n ; - fprintf fmt " : Type := {@[<hv 2>" ; - Plib.iteri - (fun idx (f,t) -> - match idx with - | Ifirst | Imiddle -> - fprintf fmt "@ %s : %a ;" (self#field f) self#pp_tau t - | Isingle | Ilast -> - fprintf fmt "@ %s : %a" (self#field f) self#pp_tau t - ) fts ; - fprintf fmt "@]@ }@].@\n" ; - end - | Tsum cases -> - begin - fprintf fmt "@[<hv 0>Inductive %s" (self#datatype adt) ; - self#pp_declare_poly fmt n ; - fprintf fmt " : Type :=" ; - let result = Data(adt,Kind.type_params n) in - List.iter - (fun (c,ts) -> - fprintf fmt "@ | @[<hov 2>%s : " (link_name (self#link c)) ; - List.iter (fun t -> fprintf fmt "@ %a ->" self#pp_tau t) ts ; - fprintf fmt "@ %a@]" self#pp_tau result ; - ) cases ; - fprintf fmt ".@]@\n" ; - end - - method declare_signature fmt f ts t = - begin - fprintf fmt "@[<hov 4>Parameter %s :" (link_name (self#link f)) ; - List.iter (fun t -> fprintf fmt "@ %a ->" self#pp_tau t) ts ; - fprintf fmt "@ %a.@]@\n" self#pp_tau t ; - end - - method declare_inductive fmt f ts t l = - begin - fprintf fmt "@[<hov 4>Inductive %s :" (link_name (self#link f)) ; - List.iter (fun t -> fprintf fmt "@ %a ->" self#pp_tau t) ts ; - fprintf fmt "@ %a :=" self#pp_tau t ; - List.iter - (fun (lemma,xs,(_:trigger list list),p) -> - fprintf fmt "@ | @[<hov 2>%s: %a@]" lemma self#pp_prop (T.e_forall xs p) - ) l ; - fprintf fmt ".@]@\n" - end - - method declare_definition fmt f xs t e = - self#global - begin fun () -> - fprintf fmt "@[<hov 4>Definition %s" (link_name (self#link f)) ; - List.iter - (fun x -> - let a = self#bind x in - let t = T.tau_of_var x in - fprintf fmt "@ (%a : %a)" self#pp_var a self#pp_tau t - ) xs ; - fprintf fmt "@ : %a :=@ " self#pp_tau t ; - fprintf fmt "@[<hov 2>%a@]@].@\n" (self#pp_expr t) e ; - end - - method declare_fixpoint ~prefix fmt f xs t e = - begin - self#declare_signature fmt f (List.map tau_of_var xs) t ; - let fix = prefix ^ (link_name (self#link f)) in - self#declare_axiom fmt fix xs [] - (e_eq (e_fun ~result:t f (List.map e_var xs)) e) ; - end - - method declare_axiom fmt lemma xs (_:trigger list list) p = - self#global - begin fun () -> - fprintf fmt "@[<hov 2>Hypothesis %s: %a@].@\n" - lemma self#pp_prop (T.e_forall xs p) - end - - end - -end diff --git a/src/plugins/qed/export_why3.ml b/src/plugins/qed/export_why3.ml index 6ed4f1b2e7b448e78d4efabac0a73d73d8626404..2d7b39ce7c3d5412c4ee2cd93ffe2cf283f1e155 100644 --- a/src/plugins/qed/export_why3.ml +++ b/src/plugins/qed/export_why3.ml @@ -231,7 +231,7 @@ struct | F_left f, _ -> Plib.pp_fold_apply ~f pretty fmt ts | F_right f, _ -> Plib.pp_fold_apply_rev ~f pretty fmt (List.rev ts) | F_assoc op, _ -> Plib.pp_assoc ~op pretty fmt ts - | F_subst s, _ -> Plib.substitute_list pretty s fmt ts + | F_subst (_, s), _ -> Plib.substitute_list pretty s fmt ts | F_list(fc,fn) , _ -> let rec plist fc fn fmt = function | [] -> pp_print_string fmt fn diff --git a/src/plugins/reduc/collect.ml b/src/plugins/reduc/collect.ml index 448af313ea283befccaa4f5f45e872f423153a86..f71af89a6af656be9cd41bad7edc483692081403 100644 --- a/src/plugins/reduc/collect.ml +++ b/src/plugins/reduc/collect.ml @@ -85,7 +85,7 @@ let rec collect_off typ = | TArray (arrtyp, e_opt, _) -> debug "Array of length %a" (Pretty_utils.pp_opt Printer.pp_exp) e_opt; begin try collect_array arrtyp [] (Cil.lenOfArray64 e_opt) - with Cil.LenOfArray -> [] end + with Cil.LenOfArray _ -> [] end | TVoid _ | TFun _ | TPtr _ | TEnum _ | TNamed _ | TBuiltin_va_list _ | TComp ({cfields = None}, _)-> [] diff --git a/src/plugins/reduc/dune b/src/plugins/reduc/dune new file mode 100644 index 0000000000000000000000000000000000000000..fd79d6cac46ab92cf14d3a7092d0b40c52ed67b1 --- /dev/null +++ b/src/plugins/reduc/dune @@ -0,0 +1,18 @@ +(rule + (alias frama-c-configure) + (deps (universe)) + (action (progn + (echo "Reduc:" %{lib-available:frama-c-reduc.core} "\n") + ) + ) +) + +(library + (name reduc) + (optional) + (public_name frama-c-reduc.core) + (flags -open Frama_c_kernel) + (libraries frama-c.kernel frama-c-inout.core frama-c-eva.core) +) + +(plugin (optional) (name reduc) (libraries frama-c-reduc.core) (site (frama-c plugins))) diff --git a/src/plugins/reduc/dune-project b/src/plugins/reduc/dune-project new file mode 100644 index 0000000000000000000000000000000000000000..4d868c8149eb2d22f293bd1e7800a8c36443fc02 --- /dev/null +++ b/src/plugins/reduc/dune-project @@ -0,0 +1,3 @@ +(lang dune 2.8) +(name frama-c-reduc) +(using dune_site 0.1) diff --git a/src/plugins/reduc/frama-c-reduc.opam b/src/plugins/reduc/frama-c-reduc.opam new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/plugins/reduc/reduc.ml b/src/plugins/reduc/reduc.ml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/plugins/reduc/reduc_options.ml b/src/plugins/reduc/reduc_options.ml index ad35ea9c8c13a1c819598b57a589e1a0048ed58a..780909519b2cde982e3412635f811f9fcb18898c 100644 --- a/src/plugins/reduc/reduc_options.ml +++ b/src/plugins/reduc/reduc_options.ml @@ -24,7 +24,7 @@ include Plugin.Register (struct let name = "Reduction" let shortname = "reduc" - let help = "Generate ACSL annotations from Value Analysis informations" + let help = "Generate ACSL annotations from Eva information" end) module Reduc = @@ -40,7 +40,7 @@ module GenAnnot = (struct let option_name = "-reduc-gen-annot" let arg_name = "gen-annot-heuristic" - let help = "Heuristic to generate annotations from Value" + let help = "Heuristic to generate annotations from Eva" let default = "inout" end) let () = GenAnnot.set_possible_values ["inout"; "all"] diff --git a/src/plugins/rte/options.ml b/src/plugins/rte/options.ml index 2e5b4d55f5bcf4ebc6b571d5a95459e2ac1ba08c..ccd4cfe0d3faee3a75ae11619f8865f2a9eaf188 100644 --- a/src/plugins/rte/options.ml +++ b/src/plugins/rte/options.ml @@ -125,7 +125,8 @@ module FunctionSelection = let help = "select <fun> for analysis (default all functions)" end) -let warn ?source fmt = warning ?source ~current:true ~once:true fmt +let dkey_annot = register_category "annot" +let () = add_debug_keys dkey_annot (* Local Variables: diff --git a/src/plugins/rte/options.mli b/src/plugins/rte/options.mli index d2d78c6e139f56faf130d6bc25c0ebfb93421905..462eda7583574d75ef959ff0219ba97f2bb6e06e 100644 --- a/src/plugins/rte/options.mli +++ b/src/plugins/rte/options.mli @@ -35,7 +35,7 @@ module Trivial : Parameter_sig.Bool module Warn : Parameter_sig.Bool module FunctionSelection: Parameter_sig.Kernel_function_set -val warn: ?source:Filepath.position -> ('a, Format.formatter, unit) format -> 'a +val dkey_annot: category (* Local Variables: diff --git a/src/plugins/rte/register.ml b/src/plugins/rte/register.ml index 75b8dba172cb181233de116ec621dbbb86fb436c..523f3a797a92b1f8c1a69565d6b40a2f8a758185 100644 --- a/src/plugins/rte/register.ml +++ b/src/plugins/rte/register.ml @@ -147,12 +147,23 @@ let _ignore = ~journalize:false Visit.get_annotations_exp +let _ignore = + let kf = Kernel_function.ty in + Dynamic.register + ~plugin:"RteGen" + "all_statuses" + Datatype.(list (triple string (func2 kf bool unit) (func kf bool))) + ~journalize:false + Generator.all_statuses + let main () = (* reset "rte generated" properties for all functions *) if Options.Enabled.get () then begin - Options.feedback ~level:2 "generating annotations"; + Options.feedback ~dkey:Options.dkey_annot ~level:2 + "generating annotations"; !Db.RteGen.compute (); - Options.feedback ~level:2 "annotations computed" + Options.feedback ~dkey:Options.dkey_annot ~level:2 + "annotations computed" end let () = Db.Main.extend main diff --git a/src/plugins/rte/rte.ml b/src/plugins/rte/rte.ml index 1e027d5d5f170a4c2463d74a83296d85c2cab93d..d583bf9af52bd54a07d5a7bcf4e423b2dde5dfec 100644 --- a/src/plugins/rte/rte.ml +++ b/src/plugins/rte/rte.ml @@ -305,7 +305,8 @@ let shift_overflow_assertion ~signed ~remove_trivial ~on_alarm (exp, op, lexp, r let size = Cil.bitsSizeOf t in if size <> Cil.bitsSizeOf (Cil.typeOf lexp) then (* size of result type should be size of left (promoted) operand *) - Options.warn "problem with bitsSize of %a: not treated" Printer.pp_exp exp; + Options.warning ~current:true ~once:true + "problem with bitsSize of %a: not treated" Printer.pp_exp exp; if op = Shiftlt then (* compute greatest representable "size bits" (signed) integer *) let maxValResult = diff --git a/src/plugins/rte/visit.ml b/src/plugins/rte/visit.ml index d7778383f58cd0e596b43f7e09d75669a43adb54..908ec80434e30091fc609a298ea8e5a7a7afd1e9 100644 --- a/src/plugins/rte/visit.ml +++ b/src/plugins/rte/visit.ml @@ -345,7 +345,6 @@ class annot_visitor kf flags on_alarm = object (self) | StartOf _ | AddrOf _ -> if self#do_pointer_value () then self#generate_assertion Rte.pointer_value exp - | Info _ | UnOp _ | Const _ | BinOp _ -> () @@ -471,12 +470,13 @@ let annotate ?flags kf = comp Finite_float.accessor flags.finite_float ||| comp Bool_value.accessor flags.bool_value then begin - Options.feedback "annotating function %a" Kernel_function.pretty kf; + Options.feedback ~dkey:Options.dkey_annot + "annotating function %a" Kernel_function.pretty kf; let warn = Options.Warn.get () in let on_alarm stmt ~invalid alarm = let ca, _ = register Generator.emitter kf stmt ~invalid alarm in if warn && invalid then - Options.warn "@[guaranteed RTE:@ %a@]" + Options.warning ~current:true ~once:true "@[guaranteed RTE:@ %a@]" Printer.pp_code_annotation ca in let vis = new annot_visitor kf flags on_alarm in diff --git a/src/plugins/scope/datascope.ml b/src/plugins/scope/datascope.ml index d4cab9e063d6590ddcd1586d9fafb89941ba01e1..26d5806673e8aca286bbdc294cd813dc5c2202cd 100644 --- a/src/plugins/scope/datascope.ml +++ b/src/plugins/scope/datascope.ml @@ -28,11 +28,13 @@ open Cil_types let cat_rm_asserts_name = "rm_asserts" let () = Plugin.default_msg_keys [cat_rm_asserts_name] +let name = "scope" + module R = Plugin.Register (struct - let name = "scope" - let shortname = "scope" + let name = name + let shortname = name let help = "data dependencies higher level functions" end) @@ -694,6 +696,15 @@ let () = ("Value.rm_asserts", Datatype.func Datatype.unit Datatype.unit)) Db.Value.rm_asserts rm_asserts +let rm_asserts = + Dynamic.register + ~comment:"Remove redundant alarms. Used by the Eva plugin." + ~plugin:name + "rm_asserts" + Datatype.(func unit unit) + ~journalize:true + rm_asserts + (* Local Variables: compile-command: "make -C ../../.." diff --git a/src/plugins/server/Makefile.in b/src/plugins/server/Makefile.in index 0736b25b9d0e2ff17b1d17b90d33a96e8a491810..e2428ee5cfbb639f0772cacb16a57ba8ab99148d 100644 --- a/src/plugins/server/Makefile.in +++ b/src/plugins/server/Makefile.in @@ -43,6 +43,7 @@ PLUGIN_CMO:= \ data main request states \ server_doc \ server_batch \ + server_socket \ kernel_ast \ kernel_main \ kernel_project \ @@ -54,7 +55,7 @@ PLUGIN_TESTS_DIRS := batch PLUGIN_REQUIRES:= yojson -PLUGIN_UNDOC:= server_batch.ml server_zmq.ml +PLUGIN_UNDOC:= server_batch.ml server_zmq.ml server_socket.ml PLUGIN_GENERATED:= $(PLUGIN_DIR)/Server.mli diff --git a/src/plugins/server/main.ml b/src/plugins/server/main.ml index c30046212c893f7f92044d123fd6742a4d2d124f..285ab01484999d65e9204c335342564e923a932f 100644 --- a/src/plugins/server/main.ml +++ b/src/plugins/server/main.ml @@ -26,7 +26,6 @@ module Senv = Server_parameters - (* -------------------------------------------------------------------------- *) (* --- Registry --- *) (* -------------------------------------------------------------------------- *) diff --git a/src/plugins/server/server_socket.ml b/src/plugins/server/server_socket.ml new file mode 100644 index 0000000000000000000000000000000000000000..5f6a5b6bf4a9a6dd2b474cb221acc32b5fc00a09 --- /dev/null +++ b/src/plugins/server/server_socket.ml @@ -0,0 +1,273 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2021 *) +(* CEA (Commissariat à l'énergie atomique et aux énergies *) +(* alternatives) *) +(* *) +(* you can redistribute it and/or modify it under the terms of the GNU *) +(* Lesser General Public License as published by the Free Software *) +(* Foundation, version 2.1. *) +(* *) +(* It is distributed in the hope that it will be useful, *) +(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) +(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) +(* GNU Lesser General Public License for more details. *) +(* *) +(* See the GNU Lesser General Public License version 2.1 *) +(* for more details (enclosed in the file licenses/LGPLv2.1). *) +(* *) +(**************************************************************************) + +(* -------------------------------------------------------------------------- *) +(* --- Socket Server Options --- *) +(* -------------------------------------------------------------------------- *) + +module Senv = Server_parameters + +let socket_group = Senv.add_group "Protocol Unix Sockets" + +let () = Parameter_customize.set_group socket_group +module Socket = Senv.String + (struct + let option_name = "-server-socket" + let arg_name = "url" + let default = "" + let help = + "Launch the UnixSocket server (in background).\n\ + The server can handle GET requests during the\n\ + execution of the frama-c command line.\n\ + Finally, the server is executed until shutdown." + end) + +let _ = Server_doc.protocole + ~title:"Unix Socket Protocol" + ~readme:"server_socket.md" + +(* -------------------------------------------------------------------------- *) +(* --- Low-level Messages --- *) +(* -------------------------------------------------------------------------- *) + +let buffer_size = 65536 + +type channel = { + mutable eof : bool ; + inc : in_channel ; + out : out_channel ; + tmp : bytes ; + buffer : Buffer.t ; +} + +let feed_bytes ch = + if not ch.eof then + try + let n = input ch.inc ch.tmp 0 buffer_size in + Buffer.add_subbytes ch.buffer ch.tmp 0 n ; + with + | Sys_blocked_io -> () + | End_of_file -> ch.eof <- true + +let read_data ch = + try + let h = match Buffer.nth ch.buffer 0 with + | 'S' -> 3 + | 'L' -> 7 + | 'W' -> 15 + | _ -> raise (Invalid_argument "Server_socket.read") + in + let hex = Buffer.sub ch.buffer 1 h in + let len = int_of_string ("0x" ^ hex) in + let data = Buffer.sub ch.buffer (1+h) len in + let p = 1 + h + len in + let n = Buffer.length ch.buffer - p in + let rest = Buffer.sub ch.buffer p n in + Buffer.reset ch.buffer ; + Buffer.add_string ch.buffer rest ; + Some data + with Invalid_argument _ -> + None + +let write_data ch data = + begin + let len = String.length data in + let hex = + if len < 0xFFF then Printf.sprintf "S%03x" len else + if len < 0xFFFFFFF then Printf.sprintf "L%07x" len else + Printf.sprintf "W%015x" len + in + output_string ch.out hex ; + output_string ch.out data ; + flush ch.out ; + end + +(* -------------------------------------------------------------------------- *) +(* --- Request Encoding --- *) +(* -------------------------------------------------------------------------- *) + +let jfield fd js = Json.field fd js |> Json.string + +let decode (data : string) : string Main.request = + match data with + | "\"POLL\"" -> `Poll + | "\"SHUTDOWN\"" -> `Shutdown + | _ -> + let js = Yojson.Basic.from_string data in + match jfield "cmd" js with + | "GET" | "SET" | "EXEC" -> + let id = jfield "id" js in + let request = jfield "request" js in + let data = Json.field "data" js in + `Request(id,request,data) + | "SIGON" -> `SigOn (jfield "id" js) + | "SIGOFF" -> `SigOff (jfield "id" js) + | "KILL" -> `Kill (jfield "id" js) + | _ -> + Senv.debug ~level:2 "Invalid socket command:@ @[<hov 2>%a@]" + Json.pp js ; + raise Not_found + +let encode (resp : string Main.response) : string = + let js = + match resp with + | `Data(id,data) -> `Assoc [ + "res", `String "DATA" ; + "id", `String id ; + "data", data ] + | `Error(id,msg) -> `Assoc [ + "res", `String "ERROR" ; + "id", `String id ; + "msg", `String msg ] + | `Killed id -> `Assoc [ + "res", `String "KILLED" ; + "id", `String id ] + | `Rejected id -> `Assoc [ + "res", `String "REJECTED" ; + "id", `String id ] + | `Signal id -> `Assoc [ + "res", `String "SIGNAL" ; + "id", `String id ] + in Yojson.Basic.to_string ~std:false js + +let parse ch = + let rec scan cmds ch = + match read_data ch with + | None -> List.rev cmds + | Some data -> + match decode data with + | cmd -> scan (cmd::cmds) ch + | exception _ -> scan cmds ch + in scan [] ch + +(* -------------------------------------------------------------------------- *) +(* --- Socket Messages --- *) +(* -------------------------------------------------------------------------- *) + +let callback ch rs = + List.iter + (fun r -> + match encode r with + | data -> write_data ch data + | exception _ -> () + ) rs + +let commands ch = + if ch.eof then None else + begin + feed_bytes ch ; + match parse ch with + | [] -> None + | requests -> Some Main.{ requests ; callback = callback ch } + end + +(* -------------------------------------------------------------------------- *) +(* --- Establish the Server --- *) +(* -------------------------------------------------------------------------- *) + +type socket = { + socket : Unix.file_descr ; + mutable channel : channel option ; +} + +let close (s: socket) = + match s.channel with None -> () | Some ch -> + begin + s.channel <- None ; + close_in ch.inc ; + close_out ch.out ; + end + +let fetch (s:socket) () = + try + match s.channel with + | Some ch -> commands ch + | None -> + let fd,_ = Unix.accept ~cloexec:true s.socket in + let inc = Unix.in_channel_of_descr fd in + let out = Unix.out_channel_of_descr fd in + Senv.debug "Client connected" ; + let ch = { + eof = false ; inc ; out ; + tmp = Bytes.create buffer_size ; + buffer = Buffer.create buffer_size ; + } in + s.channel <- Some ch ; + commands ch + with + | Unix.Unix_error _ -> close s ; None + | exn -> + Senv.warning "Socket: exn %s" (Printexc.to_string exn) ; + close s ; None + +let bind fd = + let socket = { socket = fd ; channel = None } in + try + Unix.set_nonblock fd ; + Unix.listen fd 1 ; + Unix.set_nonblock fd ; + ignore (Sys.signal Sys.sigpipe Signal_ignore) ; + let pretty = Format.pp_print_string in + let server = Main.create ~pretty ~fetch:(fetch socket) () in + Extlib.safe_at_exit begin fun () -> + Main.stop server ; + close socket ; + end ; + Main.start server ; + Cmdline.at_normal_exit (fun () -> Main.run server) ; + with exn -> + close socket ; + raise exn + +(* -------------------------------------------------------------------------- *) +(* --- Synchronous Server --- *) +(* -------------------------------------------------------------------------- *) + +let server = ref None + +let cmdline () = + let addr = Socket.get () in + match !server with + | Some addr0 -> + if Senv.debug_atleast 1 && addr <> addr0 then + Senv.warning "Socket server already running on [%s]." addr0 + else + Senv.feedback "Socket server already running." + | None -> + if addr <> "" then + try + server := Some addr ; + if Sys.file_exists addr then Unix.unlink addr ; + let fd = Unix.socket PF_UNIX SOCK_STREAM 0 in + Unix.bind fd (ADDR_UNIX addr) ; + if Senv.debug_atleast 1 then + Senv.feedback "Socket server running on [%s]." addr + else + Senv.feedback "Socket server running." ; + bind fd + with exn -> + Senv.fatal "Server socket failed.@\nError: %s@" + (Printexc.to_string exn) + +let () = Db.Main.extend cmdline + +(* -------------------------------------------------------------------------- *) diff --git a/src/plugins/wp/ProverErgo.mli b/src/plugins/server/server_socket.mli similarity index 74% rename from src/plugins/wp/ProverErgo.mli rename to src/plugins/server/server_socket.mli index 6355a6e1b81c47b26e11890a6737d478bf024a4e..e472344b807649188e8567bf9720f5a7f7ca1d51 100644 --- a/src/plugins/wp/ProverErgo.mli +++ b/src/plugins/server/server_socket.mli @@ -1,9 +1,9 @@ (**************************************************************************) (* *) -(* This file is part of WP plug-in of Frama-C. *) +(* This file is part of Frama-C. *) (* *) (* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) +(* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) (* you can redistribute it and/or modify it under the terms of the GNU *) @@ -20,13 +20,4 @@ (* *) (**************************************************************************) -open Task -open VCS - -(* -------------------------------------------------------------------------- *) -(* --- Alt-Ergo Theorem Prover --- *) -(* -------------------------------------------------------------------------- *) - -val dkey_cluster: Wp_parameters.category - -val prove : config:config -> mode:mode -> Wpo.t -> result task +(* No interface, registered via side-effects *) diff --git a/src/plugins/server/share/server_socket.md b/src/plugins/server/share/server_socket.md new file mode 100644 index 0000000000000000000000000000000000000000..c43990c8cea51c2ee65bfd10ad0227af1038b038 --- /dev/null +++ b/src/plugins/server/share/server_socket.md @@ -0,0 +1,63 @@ +# Unix Sockets Protocol + +This section presents entry point for Frama-C Server based on standard Unix +Sockets. It is activated by option `-server-socket <URL>` option of the Server +plug-in, which is compiled when the OCaml package `zmq` is detected at Frama-C +configure time. + +The protocol builds a pair of Unix sockets from the OCaml unix standard library. + +```shell +$ frama-c [options...] -then -server-socket /tmp/my-server.io +``` + +## Messages Chunk Format + +Messages are exchanged through non-blocking I/O on sockets input and output streams. +Each individual message is formatted into _chunks_ with any of the following formats: + + | 'S' | 3-HEX | n-DATA | -- with n = 0xHHH + | 'L' | 7-HEX | n-DATA | -- with n = 0xHHH,HHHH + | 'W' | 15-HEX | n-DATA | -- with n = 0xHHH,HHHH,HHHH,HHHH + +The first byte of a message chunk is one ASCII character encoding the data-length format: +- `'S'` (short) : the length consists of 3 hex-digits in ASCII format; +- `'L'` (long) : the length consists of 7 hex-digits in ASCII format; +- `'W'` (wide) : the length consists of 15 hex-digits in ASCII format. + +The last part of the message consists of `0xHEX` bytes of data, which is an `UTF-8` +encoded JSON data. + +## Input Message Format + +An input message chunk consists of a single command encoded as follows: + +| Commands | JSON Message | +|:--------|:--------------| +| `POLL` | `"POLL"` | +| `SHUTDOWN` | `"SHUTDOWN"` | +| `GET(id,request,data)` | `{ cmd = 'GET', id, request, data }` | +| `SET(id,request,data)` | `{ cmd = 'SET', id, request, data }` | +| `EXEC(id,request,data)` | `{ cmd = 'EXEC', id, request, data }` | +| `SIGON(id)` | `{ cmd = 'SIGON', id }` | +| `SIGOFF(id)` | `{ cmd = 'SIGOFF', id }` | +| `KILL(id)` | `{ cmd = 'KILL', id }` | + +## Output Message Format + +An output message chunk consists of a single response encoded as follows: + +| Response | JSON Message | +|:--------|:--------------| +| `DATA(id,data)` | `{ res = 'DATA', id, data }` | +| `ERROR(id,msg)` | `{ res = 'ERROR', id, msg }` | +| `KILLED(id)` | `{ res = 'KILLED', id }` | +| `REJECTED(id)` | `{ res = 'REJECTED', id }` | +| `SIGNAL(id)` | `{ res = 'SIGNAL', id }` | + +The special last case is used when the server is busy or died or some low-level +error occurs. + +## Data Format + +Request identifiers can be any JSON string and data are in JSON format. diff --git a/src/plugins/server/tests/.gitignore b/src/plugins/server/tests/.gitignore index e2f5dd2eb20cb10838ae60e263317b57fdec63e7..a002f646b79ae980fea08ebe8b30f1f8dd5fa48c 100644 --- a/src/plugins/server/tests/.gitignore +++ b/src/plugins/server/tests/.gitignore @@ -1 +1,2 @@ -result \ No newline at end of file +/ptests_config +result diff --git a/src/plugins/value/.merlin b/src/plugins/value/.merlin new file mode 100644 index 0000000000000000000000000000000000000000..4a78234301d143f5fd80e27a0a5e2fcc90106c19 --- /dev/null +++ b/src/plugins/value/.merlin @@ -0,0 +1,5 @@ +B ./** +S ./** +B ../value_types/** +S ../value_types/** +REC diff --git a/src/plugins/value/Eva.ml b/src/plugins/value/Eva.ml index e209524917b88e05133864a1b9fc1ce18ba0a071..8970f50d61dce4b27f9676156ccb8774006b2a77 100644 --- a/src/plugins/value/Eva.ml +++ b/src/plugins/value/Eva.ml @@ -47,4 +47,5 @@ module Private = struct module Domain_builder = Eva__Domain_builder module Main_locations = Eva__Main_locations module Eval_annots = Eva__Eval_annots + module Eva_dynamic = Eva_dynamic end diff --git a/src/plugins/value/Eva.mli b/src/plugins/value/Eva.mli index 8e5f2a39a704dbe516270148489d40ae60f2ba79..f945ebda05d31667a0e6494226b5fdd3d58f51eb 100644 --- a/src/plugins/value/Eva.mli +++ b/src/plugins/value/Eva.mli @@ -46,6 +46,7 @@ module Private: sig module Domain_builder = Domain_builder module Main_locations = Main_locations module Eval_annots = Eval_annots + module Eva_dynamic = Eva_dynamic end @@ -126,13 +127,18 @@ module Eva_annotations: sig | FlowMerge of split_term (** Merge states separated by a previous split. *) - val add_slevel_annot : emitter:Emitter.t -> loc:Cil_types.location -> + val get_slevel_annot : Cil_types.stmt -> slevel_annotation option + val get_unroll_annot : Cil_types.stmt -> unroll_annotation list + val get_flow_annot : Cil_types.stmt -> flow_annotation list + val get_subdivision_annot : Cil_types.stmt -> int list + + val add_slevel_annot : emitter:Emitter.t -> Cil_types.stmt -> slevel_annotation -> unit - val add_unroll_annot : emitter:Emitter.t -> loc:Cil_types.location -> + val add_unroll_annot : emitter:Emitter.t -> Cil_types.stmt -> unroll_annotation -> unit - val add_flow_annot : emitter:Emitter.t -> loc:Cil_types.location -> + val add_flow_annot : emitter:Emitter.t -> Cil_types.stmt -> flow_annotation -> unit - val add_subdivision_annot : emitter:Emitter.t -> loc:Cil_types.location -> + val add_subdivision_annot : emitter:Emitter.t -> Cil_types.stmt -> int -> unit end diff --git a/src/plugins/value/domains/apron/apron_domain.ml b/src/plugins/value/domains/apron/apron_domain.ml index ae9be58a85904f013915c8555f84bdc20da5980b..02df6dedf82d0602cd775295e6e4a5edf5d48c00 100644 --- a/src/plugins/value/domains/apron/apron_domain.ml +++ b/src/plugins/value/domains/apron/apron_domain.ml @@ -267,7 +267,6 @@ let rec translate_expr eval oracle expr = match expr.enode with Texpr1.(Binop (op', e1', e2', translate_typ typ, round)) | CastE (typ, e)-> coerce ~cast:true eval typ (translate_expr_linearize eval oracle e) - | Info (e, _) -> translate_expr eval oracle e | AddrOf _ | StartOf _ -> raise (Out_of_Scope "translate_expr addr") | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ -> match Cil.constFoldToInt expr with diff --git a/src/plugins/value/domains/cvalue/builtins_split.ml b/src/plugins/value/domains/cvalue/builtins_split.ml index 75e71fea2ebba821cb3358e22ab870da893fbf01..1b628c5876a293f554206e1ffe05906b7d8eab6f 100644 --- a/src/plugins/value/domains/cvalue/builtins_split.ml +++ b/src/plugins/value/domains/cvalue/builtins_split.ml @@ -129,7 +129,7 @@ let rec gather_lv_in_exp acc e = | Const _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ -> acc | Lval lv | AddrOf lv | StartOf lv -> gather_lv_in_lv acc lv - | UnOp (_, e, _) | CastE (_, e) | Info (e, _) -> gather_lv_in_exp acc e + | UnOp (_, e, _) | CastE (_, e) -> gather_lv_in_exp acc e | BinOp (_, e1, e2, _) -> gather_lv_in_exp (gather_lv_in_exp acc e1) e2 and gather_lv_in_lv acc (host, offset as lv) = let acc = diff --git a/src/plugins/value/domains/cvalue/cvalue_domain.ml b/src/plugins/value/domains/cvalue/cvalue_domain.ml index 80abee069ddbf66e854c3852c71e984751c2c637..cd9f4376d4ef60a4c288d294eb3bca0ec1345b88 100644 --- a/src/plugins/value/domains/cvalue/cvalue_domain.ml +++ b/src/plugins/value/domains/cvalue/cvalue_domain.ml @@ -559,11 +559,13 @@ module State = struct let display_results () = Value_parameters.result "====== VALUES COMPUTED ======"; - Callgraph.Uses.iter_in_rev_order display; + Eva_dynamic.Callgraph.iter_in_rev_order display; Value_parameters.result "%t" Value_perf.display let post_analysis _state = - if Value_parameters.ForceValues.get () && Value_parameters.verbose_atleast 1 + if Value_parameters.ForceValues.get () + && Value_parameters.verbose_atleast 1 + && Plugin.is_present "inout" then Value_parameters.ForceValues.output display_results end diff --git a/src/plugins/value/domains/cvalue/cvalue_init.ml b/src/plugins/value/domains/cvalue/cvalue_init.ml index d6cecc8bb7e738f2d54184f7b805db51b2998ddf..4faee93725faf82ad6fc7c6ee1cf5f88ca332381 100644 --- a/src/plugins/value/domains/cvalue/cvalue_init.ml +++ b/src/plugins/value/domains/cvalue/cvalue_init.ml @@ -287,9 +287,10 @@ let initialize_var_using_type varinfo state = end; !state with - | Cil.LenOfArray -> + | Cil.LenOfArray cause -> Value_parameters.result ~once:true ~current:true - "no size specified for array, assuming 0"; + "problem with array size (%a), assuming 0" + Cil.pp_incorrect_array_length cause; (* This is either a flexible array member (for which Cil implicitly returns a size of 0, so we are doing the proper thing), or an incomplete array (which is forbidden) *) diff --git a/src/plugins/value/domains/gauges/gauges_domain.ml b/src/plugins/value/domains/gauges/gauges_domain.ml index d6cf8037d451a216e86965fadc8ce4d612d3f09d..c51111bbd3f1a9f4c8f8806c203b9e4a15971928 100644 --- a/src/plugins/value/domains/gauges/gauges_domain.ml +++ b/src/plugins/value/domains/gauges/gauges_domain.ml @@ -1019,13 +1019,12 @@ module G = struct | BinOp (op, e1, e2, _) -> aux_binop (Cil.typeOf e) op e1 e2 - | Info _ -> assert false and aux_binop typ_res op e1 e2 = let g = match op with | PlusA -> Gauge.add (aux e1) (aux e2) | Mult -> Gauge.mul (aux e1) (aux e2) | MinusA -> Gauge.sub (aux e1) (aux e2) - | PlusPI | IndexPI -> + | PlusPI -> Gauge.add (aux e1) (Gauge.mul_ct (ptr_size e1) (aux e2)) | MinusPI -> Gauge.add (aux e1) (Gauge.neg (Gauge.mul_ct (ptr_size e1) (aux e2))) diff --git a/src/plugins/value/domains/hcexprs.ml b/src/plugins/value/domains/hcexprs.ml index 89c8ddc4839c37947a3910bd7bb58ae1728d0b33..71de08879f34c3415bd168aedcb211dd42d8d070 100644 --- a/src/plugins/value/domains/hcexprs.ml +++ b/src/plugins/value/domains/hcexprs.ml @@ -166,7 +166,7 @@ let syntactic_lvalues expr = let new_lvalues = gather e empty_lvalues in let new_addr = HCESet.union new_lvalues.read new_lvalues.addr in { lvalues with addr = HCESet.union new_addr lvalues.addr } - | UnOp (_, e, _) | CastE (_, e) | Info (e, _) -> gather e lvalues + | UnOp (_, e, _) | CastE (_, e) -> gather e lvalues | BinOp (_, e1, e2, _) -> gather e1 (gather e2 lvalues) | _ -> lvalues in diff --git a/src/plugins/value/domains/octagons.ml b/src/plugins/value/domains/octagons.ml index af0b45ea28f600470f52018c2dbfc441a71a5565..f44600a260c0819b362f33a4e16e58a5059e9484 100644 --- a/src/plugins/value/domains/octagons.ml +++ b/src/plugins/value/domains/octagons.ml @@ -260,8 +260,6 @@ module Rewriting = struct if may_overflow ~cast:true typ v then [] else rewrite evaluate e else [] - | Info (e, _) -> rewrite evaluate e - | _ -> [] (* Rewrites the operation [e1 ± e2] into equivalent octagons ±(X±Y-value). *) diff --git a/src/plugins/value/domains/symbolic_locs.ml b/src/plugins/value/domains/symbolic_locs.ml index 0b797c95e5811bb54a7b01f5955bf7779990d847..b787c686b12e2763f8988d99d1d28ab7bee6a3dc 100644 --- a/src/plugins/value/domains/symbolic_locs.ml +++ b/src/plugins/value/domains/symbolic_locs.ml @@ -121,7 +121,7 @@ let interesting_exp get_locs get_val e = match e.enode with | Lval _ -> not (Cvalue.V.cardinal_zero_or_one (get_val e)) - | CastE (_, e) | UnOp (_, e, _) | Info (e, _) -> + | CastE (_, e) | UnOp (_, e, _) -> has_lvalue e | BinOp (op, e1, e2,_) -> not (is_comp op) && (has_lvalue e1 || has_lvalue e2) @@ -134,7 +134,7 @@ let interesting_exp get_locs get_val e = not (Precise_locs.cardinal_zero_or_one (get_locs lv)) | BinOp (op, e1, e2,_) -> not (is_comp op) && has_lvalue e1 && has_lvalue e2 - | CastE _ | UnOp _ | Info _ | Const _ | SizeOf _ | SizeOfStr _ | SizeOfE _ + | CastE _ | UnOp _ | Const _ | SizeOf _ | SizeOfStr _ | SizeOfE _ | AlignOf _ | AlignOfE _ | StartOf _ | AddrOf _ -> false @@ -145,7 +145,7 @@ and vars_exp (e: exp) = match e.enode with Base.Set.empty | AddrOf lv | StartOf lv | Lval lv -> vars_lv lv - | SizeOfE e | AlignOfE e | CastE (_,e) | UnOp (_,e,_) | Info (e,_) -> + | SizeOfE e | AlignOfE e | CastE (_,e) | UnOp (_,e,_) -> vars_exp e | BinOp (_,e1,e2,_) -> Base.Set.union (vars_exp e1) (vars_exp e2) and vars_host = function diff --git a/src/plugins/value/dune b/src/plugins/value/dune index c9a77c66a751cb0b0f8bbd4e402c1fcfb6d4a896..f08cda763c3ead1fc9872032e811f70667c8c3a7 100644 --- a/src/plugins/value/dune +++ b/src/plugins/value/dune @@ -68,11 +68,15 @@ transfer_stmt mem_exec iterator transfer_specification initialization analysis register compute_functions eva_annotations octagons traces_domain auto_loop_unroll domain_mode - multidim_domain eva_audit summary + multidim_domain eva_audit summary eva_dynamic + general_requests values_request taint_domain ) ; (public_interfaces (Eva)) (flags -open Frama_c_kernel) - (libraries frama-c.kernel frama-c-callgraph.core frama-c-rtegen.core frama-c-loop-analysis.core frama-c-scope.core) + (libraries frama-c.kernel frama-c-server.core + ; frama-c-callgraph.core frama-c-rtegen.core frama-c-loop-analysis.core + ; frama-c-scope.core + ) ) (plugin (optional) (name eva) (libraries frama-c-eva.core) (site (frama-c plugins))) @@ -124,3 +128,4 @@ (copy_files# values/numerors/*) (copy_files# gui_files/*) (copy_files# partitioning/*) +(copy_files# api/*) diff --git a/src/plugins/value/engine/abstractions.ml b/src/plugins/value/engine/abstractions.ml index ac5b7613dc70578f63cf3864a11ddf52de36e80a..daa7f30ed177b799041c8f00eb03aca7927a6fa5 100644 --- a/src/plugins/value/engine/abstractions.ml +++ b/src/plugins/value/engine/abstractions.ml @@ -74,16 +74,22 @@ module Config = struct let abstractions = ref [] let dynamic_abstractions = ref [] - let register ~name ~descr ?(experimental=false) ?(priority=0) abstraction = + let register_domain_option ~name ~experimental ~descr = let descr = if experimental then "Experimental. " ^ descr else descr in - Value_parameters.register_domain ~name ~descr; + Value_parameters.register_domain ~name ~descr + + let register ~name ~descr ?(experimental=false) ?(priority=0) abstraction = + register_domain_option ~name ~experimental ~descr; let flag = Flag { name; experimental; priority; abstraction } in abstractions := flag :: !abstractions; flag - let dynamic_register ~name ~descr make = - Value_parameters.register_domain ~name ~descr; - dynamic_abstractions := (name, make) :: !dynamic_abstractions + let dynamic_register ~name ~descr ?(experimental=false) ?(priority=0) make = + register_domain_option ~name ~experimental ~descr; + let make' () : flag = + Flag { name; experimental; priority; abstraction = make () } + in + dynamic_abstractions := (name,make') :: !dynamic_abstractions let configure () = let add_main_mode mode = diff --git a/src/plugins/value/engine/abstractions.mli b/src/plugins/value/engine/abstractions.mli index f5592ba0d4776acb070cac23261764f1b0545a40..86d09020a75375033a7ef211124a8143067d39d7 100644 --- a/src/plugins/value/engine/abstractions.mli +++ b/src/plugins/value/engine/abstractions.mli @@ -94,7 +94,8 @@ val register: the last argument when starting an analysis, if the -eva-domains option has been set to [name]. See function {!register} for more details. *) val dynamic_register: - name:string -> descr:string -> (unit -> flag) -> unit + name:string -> descr:string -> ?experimental:bool -> ?priority:int -> + (unit -> 'v abstraction) -> unit (** Reduced product between two value abstractions, identified by their keys. *) type ('a, 'b) value_reduced_product = diff --git a/src/plugins/value/engine/compute_functions.ml b/src/plugins/value/engine/compute_functions.ml index 718da24a52985bef50b701c9ca5e90154106c37e..89f505305e48128fbed9ca567db7db6b36124c7b 100644 --- a/src/plugins/value/engine/compute_functions.ml +++ b/src/plugins/value/engine/compute_functions.ml @@ -54,6 +54,12 @@ let options_ok () = Value_parameters.BuiltinsOverrides.iter (fun (kf, _) -> check_assigns kf); Value_parameters.UsePrototype.iter (fun kf -> check_assigns kf) +let plugins_ok () = + if not (Plugin.is_present "inout") then + Value_parameters.warning + "The inout plugin is missing: some features are disabled, \ + and the analysis may have degraded precision and performance." + (* Do something tasteless in case the user did not put a spec on functions for which he set [-eva-use-spec]: generate an incorrect one ourselves *) let generate_specs () = @@ -73,6 +79,7 @@ let generate_specs () = let pre_analysis () = floats_ok (); options_ok (); + plugins_ok (); Split_return.pretty_strategies (); generate_specs (); Widen.precompute_widen_hints (); @@ -108,10 +115,10 @@ let post_analysis () = (* Try to refine the 'Unknown' statuses that have been emitted during this analysis. *) Eval_annots.mark_green_and_red (); - Eval_annots.mark_rte (); + Eva_dynamic.RteGen.mark_generated_rte (); post_analysis_cleanup ~aborted:false; (* Remove redundant alarms *) - if Value_parameters.RmAssert.get () then !Db.Value.rm_asserts () + if Value_parameters.RmAssert.get () then Eva_dynamic.Scope.rm_asserts () (* Registers signal handlers for SIGUSR1 and SIGINT to cleanly abort the Eva analysis. Returns a function that restores previous signal behaviors after diff --git a/src/plugins/value/engine/evaluation.ml b/src/plugins/value/engine/evaluation.ml index 9a171581a4fc9e7865ee0433a1c36c778d9c2ef7..c194ece602cccce7dd801b1e183b30b32cb8c70f 100644 --- a/src/plugins/value/engine/evaluation.ml +++ b/src/plugins/value/engine/evaluation.ml @@ -421,7 +421,7 @@ module Make | _ -> false let may_overflow = function - | Shiftlt | Mult | MinusPP | MinusPI | IndexPI | PlusPI + | Shiftlt | Mult | MinusPP | MinusPI | PlusPI | PlusA | Div | Mod | MinusA -> true | _ -> false @@ -886,7 +886,6 @@ module Make v, reduction, volatile in match expr.enode with - | Info (e, _) -> internal_forward_eval context e | Const constant -> internal_forward_eval_constant context expr constant | Lval _lval -> assert false @@ -1056,7 +1055,7 @@ module Make let size_expr = Option.get array_size in (* array_size exists *) assume_valid_index ~size ~size_expr ~index_expr index with - | Cil.LenOfArray -> `Value index, Alarmset.none (* unknown array size *) + | Cil.LenOfArray _ -> `Value index, Alarmset.none (* unknown array size *) in valid_index >>=: fun index -> Loc.forward_index typ_pointed index roffset, typ_offs, @@ -1314,15 +1313,14 @@ module Make Value.backward_cast ~src_typ ~dst_typ ~src_val ~dst_val:value >>- function v -> backward_eval fuel state e v end - | Info (e, _) -> backward_eval fuel state e None | _ -> `Value () and recursive_descent fuel state expr = match expr.enode with | Lval lval -> backward_lval fuel state lval | UnOp (_, e, _) - | CastE (_, e) - | Info (e, _) -> backward_eval fuel state e None + | CastE (_, e) -> + backward_eval fuel state e None | BinOp (_binop, e1, e2, _typ) -> backward_eval fuel state e1 None >>- fun () -> backward_eval fuel state e2 None @@ -1490,8 +1488,8 @@ module Make match expr.enode with | Lval lval -> recursive_descent_lval state lval | UnOp (_, e, _) - | CastE (_, e) - | Info (e, _) -> second_forward_eval state e + | CastE (_, e) -> + second_forward_eval state e | BinOp (_binop, e1, e2, _typ) -> second_forward_eval state e1 >>- fun () -> second_forward_eval state e2 diff --git a/src/plugins/value/engine/subdivided_evaluation.ml b/src/plugins/value/engine/subdivided_evaluation.ml index 677b519020ead6dcc18e2ec04fc7fe039dccd42f..61a0a65264687d9a08090f372bfa90331d179aaa 100644 --- a/src/plugins/value/engine/subdivided_evaluation.ml +++ b/src/plugins/value/engine/subdivided_evaluation.ml @@ -98,7 +98,7 @@ let gather_non_linear expr = if LvalMap.is_empty map && Cil.isArithmeticType (Cil.typeOfLval lv) then LvalMap.singleton lv (expr, d, LvalSet.empty) else map - | UnOp (_, e, _) | CastE (_, e) | Info (e, _) -> compute depth e + | UnOp (_, e, _) | CastE (_, e) -> compute depth e | BinOp (_, e1, e2, _) -> (* Lvalues that appear in [e1] and [e2] are bound to [expr]. *) let d = succ depth in union expr d (compute d e1) (compute d e2) diff --git a/src/plugins/value/engine/transfer_stmt.ml b/src/plugins/value/engine/transfer_stmt.ml index 261bfb1116eee5def3195c54a383529c0c533e3b..19c6c9973d540c62f1f070dc7f40fa2be9929b18 100644 --- a/src/plugins/value/engine/transfer_stmt.ml +++ b/src/plugins/value/engine/transfer_stmt.ml @@ -81,10 +81,12 @@ let do_copy_at = function with Not_found -> assert false (* Warn for call arguments that contain uninitialized/escaping except on - [Frama_C_show_each] directives or if the user disables these alarms. *) + [Frama_C_show_each] directives or if the user disables these alarms + on functions whose body is analyzed. *) let is_determinate kf = let name = Kernel_function.get_name kf in - warn_indeterminate kf && not (Ast_info.is_frama_c_builtin name) + (warn_indeterminate kf || !Db.Value.use_spec_instead_of_definition kf) + && not (Ast_info.is_frama_c_builtin name) let subdivide_stmt = Value_util.get_subdivision diff --git a/src/plugins/value/eval.ml b/src/plugins/value/eval.ml index 7a12a168d662e1d7225531415b317ba18e5bfbaf..38f26a2818715a2b85ce7be156e22ca79c1b1c36 100644 --- a/src/plugins/value/eval.ml +++ b/src/plugins/value/eval.ml @@ -150,8 +150,8 @@ let compute_englobing_subexpr ~subexpr ~expr = else let sublist = match expr.enode with | UnOp (_, e, _) - | CastE (_, e) - | Info (e, _) -> compute e + | CastE (_, e) -> + compute e | BinOp (_, e1, e2, _) -> merge (compute e1) (compute e2) | Lval (host, offset) -> diff --git a/src/plugins/value/gui_files/register_gui.ml b/src/plugins/value/gui_files/register_gui.ml index 5adf217e9f95053da29b3c13851e32527318dae4..3587497948dafbc7d40353138da1651a5b8202c2 100644 --- a/src/plugins/value/gui_files/register_gui.ml +++ b/src/plugins/value/gui_files/register_gui.ml @@ -227,9 +227,7 @@ let gui_compute_values (main_ui:main_ui) = let cleaned_outputs kf s = let outs = Db.Outputs.kinstr (Kstmt s) in - let accept = - Callgraph.Uses.accept_base ~with_formals:true ~with_locals:true kf - in + let accept = Eva_dynamic.Callgraph.accept_base kf in let filter = Locations.Zone.filter_base accept in Option.map filter outs diff --git a/src/plugins/value/legacy/eval_annots.ml b/src/plugins/value/legacy/eval_annots.ml index cb3647e4fde810b6212ce0a8e0351d24e2ee3a2f..68aed0aadab7bc2b5171980bd0962f7b4f3e8c94 100644 --- a/src/plugins/value/legacy/eval_annots.ml +++ b/src/plugins/value/legacy/eval_annots.ml @@ -102,35 +102,6 @@ let mark_unreachable () = Annotations.iter_all_code_annot do_code_annot; Visitor.visitFramacFile unreach (Ast.get ()) -let mark_rte () = - let _, mem, _ = !Db.RteGen.get_memAccess_status () in - let _, arith, _ = !Db.RteGen.get_divMod_status () in - let _, signed_ovf, _ = !Db.RteGen.get_signedOv_status () in - let _, unsigned_ovf, _ = !Db.RteGen.get_unsignedOv_status () in - let _, signed_downcast, _ = !Db.RteGen.get_signed_downCast_status () in - let _, unsigned_downcast, _ = !Db.RteGen.get_unsignedDownCast_status () in - let _, pointer_call, _ = !Db.RteGen.get_pointerCall_status () in - let _, float_to_int, _ = !Db.RteGen.get_float_to_int_status () in - let _, finite_float, _ = !Db.RteGen.get_finite_float_status () in - let b_signed_ovf = Kernel.SignedOverflow.get () in - let b_unsigned_ovf = Kernel.UnsignedOverflow.get () in - let b_signed_downcast = Kernel.SignedDowncast.get () in - let b_unsigned_downcast = Kernel.UnsignedDowncast.get () in - Globals.Functions.iter - (fun kf -> - if !Db.Value.is_called kf then ( - mem kf true; - arith kf true; - pointer_call kf true; - if b_signed_ovf then signed_ovf kf true; - if b_unsigned_ovf then unsigned_ovf kf true; - if b_signed_downcast then signed_downcast kf true; - if b_unsigned_downcast then unsigned_downcast kf true; - float_to_int kf true; - finite_float kf true; - ) - ) - let c_labels kf cs = if !Db.Value.use_spec_instead_of_definition kf then Cil_datatype.Logic_label.Map.empty diff --git a/src/plugins/value/legacy/eval_annots.mli b/src/plugins/value/legacy/eval_annots.mli index 03fbb8c51541c594f3d7954bc53a77ce0460f303..ba43b7aa2f95bfa0d3198beef927964e5c40fb74 100644 --- a/src/plugins/value/legacy/eval_annots.mli +++ b/src/plugins/value/legacy/eval_annots.mli @@ -26,5 +26,4 @@ val has_requires: spec -> bool val mark_invalid_initializers: unit -> unit val mark_unreachable: unit -> unit val mark_green_and_red: unit -> unit -val mark_rte: unit -> unit val c_labels: kernel_function -> Value_types.callstack -> Eval_terms.labels_states diff --git a/src/plugins/value/legacy/eval_terms.ml b/src/plugins/value/legacy/eval_terms.ml index b458e4be0ccf9759546b73bcc5cc40115d24f441..c36e84a45b30286e18f983451fdff6d6a4171a81 100644 --- a/src/plugins/value/legacy/eval_terms.ml +++ b/src/plugins/value/legacy/eval_terms.ml @@ -535,7 +535,7 @@ let same_etype t1 t2 = let infer_binop_res_type op targ = match op with | PlusA | MinusA | Mult | Div -> targ - | PlusPI | MinusPI | IndexPI -> + | PlusPI | MinusPI -> assert (Cil.isPointerType targ); targ | MinusPP -> Cil.intType | Mod | Shiftlt | Shiftrt | BAnd | BXor | BOr -> @@ -1225,7 +1225,10 @@ let rec eval_term ~alarm_mode env t = | Toffset (_lbl, t) -> let r = eval_term ~alarm_mode env t in let add_offset _ offs acc = Ival.join offs acc in - let offs = Location_Bytes.fold_topset_ok add_offset r.eover Ival.bottom in + let offs = + try Location_Bytes.fold_topset_ok add_offset r.eover Ival.bottom + with Abstract_interp.Error_Top -> Ival.top + in let eover = Cvalue.V.inject_ival offs in { etype = Cil.intType; ldeps = r.ldeps; @@ -1236,7 +1239,10 @@ let rec eval_term ~alarm_mode env t = | Tbase_addr (_lbl, t) -> let r = eval_term ~alarm_mode env t in let add_base b acc = V.join acc (V.inject b Ival.zero) in - let eover = Location_Bytes.fold_bases add_base r.eover V.bottom in + let eover = + try Location_Bytes.fold_bases add_base r.eover V.bottom + with Abstract_interp.Error_Top -> r.eover + in { etype = Cil.charPtrType; ldeps = r.ldeps; eover; @@ -1269,7 +1275,10 @@ let rec eval_term ~alarm_mode env t = in Ival.join acc bl in - let bl = Location_Bytes.fold_bases add_block_length r.eover Ival.bottom in + let bl = + try Location_Bytes.fold_bases add_block_length r.eover Ival.bottom + with Abstract_interp.Error_Top -> Ival.top + in let eover = V.inject_ival bl in { etype = Cil.charPtrType; ldeps = r.ldeps; @@ -1345,7 +1354,7 @@ and eval_binop ~alarm_mode env op t1 t2 = int_or_float_op te1 (V.add_untyped_under ~factor) default in let eunder_op = match op with - | PlusPI | IndexPI -> begin + | PlusPI -> begin match Bit_utils.osizeof_pointed te1 with | Int_Base.Top -> fun _ _ -> V.bottom | Int_Base.Value _ as size -> add_untyped_op size diff --git a/src/plugins/value/partitioning/auto_loop_unroll.ml b/src/plugins/value/partitioning/auto_loop_unroll.ml index 199493025d1724e231988a6e7fe848f23d82e00a..8598544a9d4fa76c93009ab6510dce021fd3efeb 100644 --- a/src/plugins/value/partitioning/auto_loop_unroll.ml +++ b/src/plugins/value/partitioning/auto_loop_unroll.ml @@ -226,7 +226,7 @@ let classify eval_ptr loop_effect lval = let rec is_const_expr expr = match expr.enode with | Lval lval -> classify_lval lval = Constant - | UnOp (_, e, _) | CastE (_, e) | Info (e, _) -> is_const_expr e + | UnOp (_, e, _) | CastE (_, e) -> is_const_expr e | BinOp (_, e1, e2, _) -> is_const_expr e1 && is_const_expr e2 | Const _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ | AddrOf _ | StartOf _ -> true @@ -262,7 +262,7 @@ let classify eval_ptr loop_effect lval = let rec get_lvalues expr = match expr.enode with | Lval lval -> [ lval ] - | UnOp (_, e, _) | CastE (_, e) | Info (e, _) -> get_lvalues e + | UnOp (_, e, _) | CastE (_, e) -> get_lvalues e | BinOp (_op, e1, e2, _typ) -> get_lvalues e1 @ get_lvalues e2 | Const _ | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ | AddrOf _ | StartOf _ -> [] @@ -308,10 +308,9 @@ let transfer_assign lval exn f ~inner_loop acc instr = let cross_equality loop lval = (* If no such single equality can be found, return [lval] unchanged. *) let exception No_equality in - let rec find_lval expr x = + let find_lval expr _x = match expr.enode with | Lval lval -> lval - | Info (e, _) -> find_lval e x | _ -> raise No_equality in let transfer ~inner_loop lval instr = @@ -367,7 +366,6 @@ module Make (Abstract: Abstractions.Eva) = struct let rec is_lval e = match e.enode with | Lval lv -> Cil_datatype.LvalStructEq.equal lval lv | CastE (typ, e) -> Cil.isIntegralType typ && is_lval e - | Info (e, _) -> is_lval e | _ -> false in match Cil.constFoldToInt expr with @@ -383,7 +381,6 @@ module Make (Abstract: Abstractions.Eva) = struct then add_to_delta binop acc e1 else raise NoIncrement | CastE (typ, e) when Cil.isIntegralType typ -> delta_assign lval e acc - | Info (e, _) -> delta_assign lval e acc | _ -> raise NoIncrement (* Computes an over-approximation of the increment of [lval] in the [loop]. diff --git a/src/plugins/value/register.ml b/src/plugins/value/register.ml index 9d8b1c670b115a38ca2c74ef4f56001aaa153a9c..2e585515cff0920c414234bc28d18bad920f517f 100644 --- a/src/plugins/value/register.ml +++ b/src/plugins/value/register.ml @@ -206,7 +206,7 @@ let rec eval_deps state e = | Lval lv -> eval_deps_lval state lv | BinOp (_,e1,e2,_) -> Locations.Zone.join (eval_deps state e1) (eval_deps state e2) - | CastE (_,e) | UnOp (_,e,_) | Info (e,_) -> + | CastE (_,e) | UnOp (_,e,_) -> eval_deps state e | AddrOf lv | StartOf lv -> eval_deps_addr state lv and eval_deps_lval state lv = diff --git a/src/plugins/value/utils/eva_annotations.ml b/src/plugins/value/utils/eva_annotations.ml index d954d3e4a060f50a9dee1b810a404ca471021a5d..c493b1149b5ddee3685b55fed93b5f4a85c70e30 100644 --- a/src/plugins/value/utils/eva_annotations.ml +++ b/src/plugins/value/utils/eva_annotations.ml @@ -102,7 +102,8 @@ struct in List.rev (Annotations.fold_code_annot filter_add stmt []) - let add ~emitter ~loc stmt annot = + let add ~emitter stmt annot = + let loc = Cil_datatype.Stmt.loc stmt in let param = M.export annot in let extension = Logic_const.new_acsl_extension name loc false param in let annot_node = Cil_types.AExtended ([], is_loop_annot, extension) in @@ -261,14 +262,14 @@ let add_slevel_annot = Slevel.add let add_unroll_annot = Unroll.add -let add_flow_annot ~emitter ~loc stmt flow_annotation = +let add_flow_annot ~emitter stmt flow_annotation = let f, annot = match flow_annotation with | FlowSplit (annot, Static) -> Split.add, annot | FlowSplit (annot, Dynamic) -> DynamicSplit.add, annot | FlowMerge annot -> Merge.add, annot in - f ~emitter ~loc stmt (annot, None) + f ~emitter stmt (annot, None) module Subdivision = Register (struct diff --git a/src/plugins/value/utils/eva_annotations.mli b/src/plugins/value/utils/eva_annotations.mli index 1bae12631f98321b1abd69b9f5d81767edc8c732..df768e5a1fbb96dc022afa594ca4a5ab9d4fc1a7 100644 --- a/src/plugins/value/utils/eva_annotations.mli +++ b/src/plugins/value/utils/eva_annotations.mli @@ -56,11 +56,11 @@ val get_flow_annot : Cil_types.stmt -> flow_annotation list val get_subdivision_annot : Cil_types.stmt -> int list val get_allocation: Cil_types.stmt -> allocation_kind -val add_slevel_annot : emitter:Emitter.t -> loc:Cil_types.location -> +val add_slevel_annot : emitter:Emitter.t -> Cil_types.stmt -> slevel_annotation -> unit -val add_unroll_annot : emitter:Emitter.t -> loc:Cil_types.location -> +val add_unroll_annot : emitter:Emitter.t -> Cil_types.stmt -> unroll_annotation -> unit -val add_flow_annot : emitter:Emitter.t -> loc:Cil_types.location -> +val add_flow_annot : emitter:Emitter.t -> Cil_types.stmt -> flow_annotation -> unit -val add_subdivision_annot : emitter:Emitter.t -> loc:Cil_types.location -> +val add_subdivision_annot : emitter:Emitter.t -> Cil_types.stmt -> int -> unit diff --git a/src/plugins/qed/export_coq.mli b/src/plugins/value/utils/eva_dynamic.ml similarity index 50% rename from src/plugins/qed/export_coq.mli rename to src/plugins/value/utils/eva_dynamic.ml index 1ae4f8c41367b7497c744aadf9e0c22c99c804f4..b62a8ec73cb2f5f61f8db4a83e434ccfcbc2f15b 100644 --- a/src/plugins/qed/export_coq.mli +++ b/src/plugins/value/utils/eva_dynamic.ml @@ -1,9 +1,9 @@ (**************************************************************************) (* *) -(* This file is part of WP plug-in of Frama-C. *) +(* This file is part of Frama-C. *) (* *) (* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) +(* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) (* you can redistribute it and/or modify it under the terms of the GNU *) @@ -20,33 +20,48 @@ (* *) (**************************************************************************) -open Logic -open Format +let get ~plugin name typ ~fallback = + try Dynamic.get ~plugin name typ + with Failure _ | Dynamic.(Unbound_value _ | Incompatible_type _) -> fallback -(** Exportation Engine for Coq. +module Callgraph = struct + let plugin = "callgraph" - Provides a full {{:Export.S.engine-c.html}engine} - from a {{:Export.S.linker-c.html}linker}. *) + let iter_in_rev_order f = + let fallback = Globals.Functions.iter in + let typ = Datatype.(func (func Kernel_function.ty unit) unit) in + get ~plugin "iter_in_rev_order" typ ~fallback f -module Make(T : Term) : -sig + let accept_base kf v = + let fallback _ _ = true in + let typ = Datatype.(func2 Kernel_function.ty Base.ty bool) in + get ~plugin "accept_base" typ ~fallback kf v +end + +module Scope = struct + let plugin = "scope" + + let rm_asserts () = + let fallback () = + Value_parameters.warning + "The scope plugin is missing: cannot remove redundant alarms." + in + let typ = Datatype.(func unit unit) in + get ~plugin "rm_asserts" typ ~fallback () +end - open T - module Env : Engine.Env with type term := term - type trigger = (var,Fun.t) Engine.ftrigger - type typedef = (tau,Field.t,Fun.t) Engine.ftypedef +module RteGen = struct + let plugin = "RteGen" - class virtual engine : - object - inherit [Z.t,ADT.t,Field.t,Fun.t,tau,var,term,Env.t] Engine.engine - method marks : Env.t * T.marks - method op_spaced : string -> bool - method declare_type : formatter -> ADT.t -> int -> typedef -> unit - method declare_axiom : formatter -> string -> var list -> trigger list list -> term -> unit - method declare_fixpoint : prefix:string -> formatter -> Fun.t -> var list -> tau -> term -> unit - method declare_signature : formatter -> Fun.t -> tau list -> tau -> unit - method declare_inductive : formatter -> Fun.t -> tau list -> tau -> (string * var list * trigger list list * term) list -> unit - method declare_definition : formatter -> Fun.t -> var list -> tau -> term -> unit - end + let all_statuses () = + let kf = Kernel_function.ty in + let typ = + Datatype.(list (triple string (func2 kf bool unit) (func kf bool))) + in + get ~plugin "all_statuses" typ ~fallback:[] + let mark_generated_rte () = + let list = all_statuses () in + let mark kf = List.iter (fun (_kind, set, _get) -> set kf true) list in + Globals.Functions.iter (fun kf -> if !Db.Value.is_called kf then mark kf) end diff --git a/src/plugins/wp/share/ergo/ArcTrigo.mlw b/src/plugins/value/utils/eva_dynamic.mli similarity index 61% rename from src/plugins/wp/share/ergo/ArcTrigo.mlw rename to src/plugins/value/utils/eva_dynamic.mli index e2640273c38a6fffe8579129b98475364cb6a35a..85648b915300cf697ce591ed119e748edad837ff 100644 --- a/src/plugins/wp/share/ergo/ArcTrigo.mlw +++ b/src/plugins/value/utils/eva_dynamic.mli @@ -1,9 +1,9 @@ (**************************************************************************) (* *) -(* This file is part of WP plug-in of Frama-C. *) +(* This file is part of Frama-C. *) (* *) (* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) +(* CEA (Commissariat à l'énergie atomique et aux énergies *) (* alternatives) *) (* *) (* you can redistribute it and/or modify it under the terms of the GNU *) @@ -20,21 +20,24 @@ (* *) (**************************************************************************) -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -(** The theory real_RealInfix_ must be appended to this file*) -(** The theory real_Abs_ must be appended to this file*) -(** The theory real_Square_ must be appended to this file*) -(** The theory real_Trigonometry_ must be appended to this file*) -logic asin : real -> real +(** Access to other plugins API via {Dynamic.get}. *) -logic acos : real -> real +module Callgraph: sig + (** Iterates over all functions in the callgraph in reverse order, i.e. from + callees to callers. If callgraph is missing, the order is unspecified. *) + val iter_in_rev_order: (Kernel_function.t -> unit) -> unit -axiom Sin_asin : - (forall x:real. ((((-1.0) <= x) and (x <= 1.0)) -> (sin(asin(x)) = x))) + (** Returns [true] if [base] is a global, or a formal or local of either [kf] + or one of its callers. If callgraph is missing, always returns true. *) + val accept_base: Kernel_function.t -> Base.t -> bool +end -axiom Cos_acos : - (forall x:real. ((((-1.0) <= x) and (x <= 1.0)) -> (cos(acos(x)) = x))) +module Scope: sig + (** Removes redundant assertions. Warns if the scope plugin is missing. *) + val rm_asserts: unit -> unit +end +module RteGen: sig + (** Marks all RTE as generated. Does nothing if the rte plugin is missing. *) + val mark_generated_rte: unit -> unit +end diff --git a/src/plugins/value/utils/eval_typ.ml b/src/plugins/value/utils/eval_typ.ml index abbfccf9ed65c716e56277bce67fd825b4f43814..a84bbbbf5111d2a201997e3bc97cbdc62cbefd46 100644 --- a/src/plugins/value/utils/eval_typ.ml +++ b/src/plugins/value/utils/eval_typ.ml @@ -138,7 +138,7 @@ let compatible_functions typ_pointer ?args kfs = let rec expr_contains_volatile expr = let rec aux expr = match expr.enode with | Lval lval -> lval_contains_volatile lval - | UnOp (_, e, _) | CastE (_, e) | Info (e, _) -> aux e + | UnOp (_, e, _) | CastE (_, e) -> aux e | AddrOf lv | StartOf lv -> lval_contains_volatile lv | BinOp (_, e1, e2, _) -> aux e1 || aux e2 | _ -> false diff --git a/src/plugins/value/utils/library_functions.ml b/src/plugins/value/utils/library_functions.ml index 845a3b516be6141c8ee2a6e9ff1a079ea9399da1..5e2b590ad7f5a1f925fc1f5c4e109358b5bfc1ef 100644 --- a/src/plugins/value/utils/library_functions.ml +++ b/src/plugins/value/utils/library_functions.ml @@ -71,20 +71,22 @@ let returned_value kf = let unsupported_specifications = - [ "asprintf", "stdio.c"; - "glob", "glob.c"; - "globfree", "glob.c"; + [ + "asprintf", "stdio.c"; + "canonicalize_path_name", "stdlib.c"; "getaddrinfo", "netdb.c"; - "getline", "stdio.c"; - "strerror", "string.c"; - "strdup", "string.c"; - "strndup", "string.c"; "getenv", "stdlib.c"; + "getline", "stdio.c"; + "glob", "glob.c"; + "globfree", "glob.c"; "posix_memalign", "stdlib.c"; "putenv", "stdlib.c"; + "realpath", "stdlib.c"; "setenv", "stdlib.c"; + "strdup", "string.c"; + "strerror", "string.c"; + "strndup", "string.c"; "unsetenv", "stdlib.c"; - "realpath", "stdlib.c" ] let unsupported_specs_tbl = diff --git a/src/plugins/value/utils/value_util.ml b/src/plugins/value/utils/value_util.ml index 548a3cc8b12f85336c171ae26bb9230950b21623..cd0d402e1f9da9f64142f1ba106955cbc0b73b3c 100644 --- a/src/plugins/value/utils/value_util.ml +++ b/src/plugins/value/utils/value_util.ml @@ -280,7 +280,7 @@ let rec zone_of_expr find_loc expr = | Lval lval -> (* Dereference of an lvalue. *) zone_of_lval find_loc lval - | UnOp (_, e, _) | CastE (_, e) | Info (e, _) -> + | UnOp (_, e, _) | CastE (_, e) -> (* Unary operators. *) process e | BinOp (_, e1, e2, _) -> @@ -329,7 +329,7 @@ let rec height_expr expr = match expr.enode with | Const _ | SizeOf _ | SizeOfStr _ | AlignOf _ -> 0 | Lval lv | AddrOf lv | StartOf lv -> height_lval lv + 1 - | UnOp (_,e,_) | CastE (_, e) | Info (e,_) | SizeOfE e | AlignOfE e + | UnOp (_,e,_) | CastE (_, e) | SizeOfE e | AlignOfE e -> height_expr e + 1 | BinOp (_,e1,e2,_) -> max (height_expr e1) (height_expr e2) + 1 diff --git a/src/plugins/value/utils/widen.ml b/src/plugins/value/utils/widen.ml index c2c63c2dff907c792e9efb14e3a2de9d65ff1dea..b124349d7b634f4038e1d7da6f9c3ca623254e9f 100644 --- a/src/plugins/value/utils/widen.ml +++ b/src/plugins/value/utils/widen.ml @@ -177,8 +177,7 @@ class pragma_widen_visitor init_widen_hints init_enclosing_loops = object(self) match expr.enode with | BinOp (Mod, _, modu, _typ) -> [modu] | BinOp (BAnd, e1, e2, _typ) -> [e1; e2] - | CastE (_, expr) - | Info (expr, _) -> find_candidates expr + | CastE (_, expr) -> find_candidates expr | _ -> [] in let process expr = @@ -295,7 +294,7 @@ class pragma_widen_visitor init_widen_hints init_enclosing_loops = object(self) let size = Cil.lenOfArray64 size in if Integer.(gt size zero) then self#add_index_hints size idx - with Cil.LenOfArray -> () + with Cil.LenOfArray _ -> () end | _ -> () end diff --git a/src/plugins/value/values/cvalue_backward.ml b/src/plugins/value/values/cvalue_backward.ml index 63d54e258d38fb1f4430e97f5435e076b62e3a03..889c776877859e26044a9b2aa40ea1c4b7d479c8 100644 --- a/src/plugins/value/values/cvalue_backward.ml +++ b/src/plugins/value/values/cvalue_backward.ml @@ -265,7 +265,7 @@ let backward_binop ~typ_res ~res_value ~typ_e1 v1 binop v2 = | PlusA, TFloat (fk, _) -> backward_add_float (Fval.kind fk) ~res_value ~v1 ~v2 `Add | MinusA, TFloat (fk, _) -> backward_add_float (Fval.kind fk) ~res_value ~v1 ~v2 `Sub - | (PlusPI | IndexPI), TPtr _ -> backward_add_ptr typ ~res_value ~v1 ~v2 true + | PlusPI, TPtr _ -> backward_add_ptr typ ~res_value ~v1 ~v2 true | MinusPI, TPtr _ -> backward_add_ptr typ ~res_value ~v1 ~v2 false | MinusPP, TInt _ -> diff --git a/src/plugins/value/values/cvalue_forward.ml b/src/plugins/value/values/cvalue_forward.ml index aabd38688fe7f6f249672a86c0cfc8903a25c80b..1a3e65a3cc587a02bc1a96f1f968e678a6f4a434 100644 --- a/src/plugins/value/values/cvalue_forward.ml +++ b/src/plugins/value/values/cvalue_forward.ml @@ -376,8 +376,7 @@ let forward_minus_pp ~typ ev1 ev2 = The function must behave as if it was acting on unbounded integers *) let forward_binop_int ~typ ev1 op ev2 = match op with - | PlusPI - | IndexPI -> V.add_untyped (Bit_utils.osizeof_pointed typ) ev1 ev2 + | PlusPI -> V.add_untyped (Bit_utils.osizeof_pointed typ) ev1 ev2 | MinusPI -> let int_base = Int_Base.neg (Bit_utils.osizeof_pointed typ) in V.add_untyped int_base ev1 ev2 diff --git a/src/plugins/variadic/classify.ml b/src/plugins/variadic/classify.ml index f2fd26fac784cc6ed0341290b6319f28852bdf16..1a183c1826e6bc76dba798b1ab13efb150f63db1 100644 --- a/src/plugins/variadic/classify.ml +++ b/src/plugins/variadic/classify.ml @@ -35,7 +35,7 @@ let find_function env s = try Some (Environment.find_function env s) with Not_found -> - Self.warning + Self.warning ~wkey:wkey_libc_framac "Unable to locate function %s which should be in the Frama-C LibC." s; None @@ -56,7 +56,7 @@ let mk_aggregator env fun_name a_pos pname a_type = (* Check that pos is a valid position in the list *) assert (a_pos >= 0); if a_pos >= List.length params then begin - Self.warning ~current:true + Self.warning ~current:true ~wkey:wkey_libc "The standard function %s should have at least %d parameters." fun_name (a_pos + 1); @@ -69,7 +69,7 @@ let mk_aggregator env fun_name a_pos pname a_type = | TArray (typ,_,_) | TPtr (typ, _) -> typ | _ -> - Self.warning ~current:true + Self.warning ~current:true ~wkey:wkey_libc "The parameter %d of standard function %s should be \ of array type." (a_pos + 1) @@ -93,7 +93,7 @@ let mk_format_fun vi f_kind f_buffer ~format_pos = and n_actual_args = List.length (Typ.params vi.vtype) in if n_actual_args < n_expected_args then begin - Self.warning ~current:true + Self.warning ~current:true ~wkey:wkey_libc "The standard function %s was expected to have at least %d fixed \ parameters but only has %d.@ \ No variadic translation will be performed." diff --git a/src/plugins/variadic/format_parser.ml b/src/plugins/variadic/format_parser.ml index eba2d018d3d56f4eb9b63bda8121a2c519e1e4dd..1fb3bee4d63f738598610414a7d24faa280e4b4f 100644 --- a/src/plugins/variadic/format_parser.ml +++ b/src/plugins/variadic/format_parser.ml @@ -26,7 +26,7 @@ open Format_pprint exception Invalid_format -let warn f = Options.Self.warning ~current:true f +let warn f = Options.Self.warning ~current:true ~wkey:Options.wkey_format f (* ************************************************************************ *) (* printf format verification *) diff --git a/src/plugins/variadic/generic.ml b/src/plugins/variadic/generic.ml index 56d847f4a86e13057df7f47a00081119cc6bf812..7361c6011a5d66cc08b911206abc7db280cd7457 100644 --- a/src/plugins/variadic/generic.ml +++ b/src/plugins/variadic/generic.ml @@ -109,7 +109,7 @@ let translate_va_builtin caller inst = if Cil.isIntegralType ty then begin let promoted_type = Cil.integralPromotion ty in if promoted_type <> ty then - Self.warning ~current:true + Self.warning ~current:true ~wkey:wkey_typing "Wrong type argument in va_start: %a is promoted to %a when used \ in the variadic part of the arguments. (You should pass %a to \ va_start)" diff --git a/src/plugins/variadic/options.ml b/src/plugins/variadic/options.ml index 9aef64f8ad3fd374a97f6ca8922009d5f45eda12..1a0d8c7c49d81bbf19e7172422986a31cebf3e3f 100644 --- a/src/plugins/variadic/options.ml +++ b/src/plugins/variadic/options.ml @@ -42,3 +42,9 @@ module Strict = Self.True distinct integral types which have the same size and \ signedness" end) + +let wkey_libc = Self.register_warn_category "libc" +let wkey_format = Self.register_warn_category "libc:format" +let wkey_libc_framac = Self.register_warn_category "libc:frama-c" +let wkey_prototype = Self.register_warn_category "prototype" +let wkey_typing = Self.register_warn_category "typing" diff --git a/src/plugins/variadic/options.mli b/src/plugins/variadic/options.mli index d5d963658af1415da29669d0096db47a0b8006db..10d98f1e66837e9cc4046bf5c63162de55c7ffad 100644 --- a/src/plugins/variadic/options.mli +++ b/src/plugins/variadic/options.mli @@ -23,3 +23,9 @@ module Self : Plugin.General_services module Enabled : Parameter_sig.Bool module Strict : Parameter_sig.Bool + +val wkey_format: Self.warn_category +val wkey_libc: Self.warn_category +val wkey_libc_framac: Self.warn_category +val wkey_prototype: Self.warn_category +val wkey_typing: Self.warn_category diff --git a/src/plugins/variadic/standard.ml b/src/plugins/variadic/standard.ml index 9e927870b2a0d3cfb34ee59fd980823934618ba4..facd3afef6da78c393fcd8a2a8ac9ec1e5ba325f 100644 --- a/src/plugins/variadic/standard.ml +++ b/src/plugins/variadic/standard.ml @@ -131,12 +131,12 @@ let cast_arg i paramtyp exp = | Strict | Tolerated -> () | (NonPortable | NonStrict) when not (Strict.get ()) -> () | NonPortable -> - Self.warning ~current:true + Self.warning ~current:true ~wkey:wkey_typing "Possible portability issues with enum type for argument %d \ (use -variadic-no-strict to avoid this warning)." (i + 1) | NonStrict | Never -> - Self.warning ~current:true + Self.warning ~current:true ~wkey:wkey_typing "Incorrect type for argument %d. \ The argument will be cast from %a to %a." (i + 1) @@ -151,12 +151,12 @@ let match_args ~callee tparams args = let paramcount = List.length tparams and argcount = List.length args in if argcount > paramcount then - Self.warning ~current:true + Self.warning ~current:true ~wkey:wkey_typing "Too many arguments: expected %d, given %d. \ Superfluous arguments will be removed." paramcount argcount else if argcount < paramcount then ( - Self.warning ~current:true + Self.warning ~current:true ~wkey:wkey_typing "Not enough arguments: expected %d, given %d." paramcount argcount; raise (Translate_call_exn callee) @@ -255,7 +255,7 @@ let aggregator_call ~fundec ~ghost aggregator scope loc mk_call vf args = let argcount = List.length args and paramcount = List.length tparams in if argcount < paramcount then begin - Self.warning ~current:true + Self.warning ~current:true ~wkey:wkey_typing "Not enough arguments: expected %d, given %d." paramcount argcount; raise (Translate_call_exn vf.vf_decl); @@ -345,7 +345,7 @@ let overloaded_call ~fundec overload block loc mk_call vf args = let tparams, new_callee = match filter_matching_prototypes overload args with | [] -> (* No matching prototype *) - Self.warning ~current:true + Self.warning ~current:true ~wkey:wkey_prototype "@[No matching prototype found for this call to %s.@.\ Expected candidates:@.\ @[<v> %a@]@.\ @@ -357,7 +357,7 @@ let overloaded_call ~fundec overload block loc mk_call vf args = | [(tparams,vi)] -> (* Exactly one matching prototype *) tparams, vi | l -> (* Several matching prototypes *) - Self.warning ~current:true + Self.warning ~current:true ~wkey:wkey_prototype "Ambiguous call to %s. Matching candidates are: \ %a" name @@ -392,7 +392,7 @@ let find_global env name = try Some (Environment.find_global env name) with Not_found -> - Self.warning ~once:true + Self.warning ~once:true ~wkey:wkey_libc_framac "Unable to locate global %s which should be in the Frama-C LibC. \ Correct specifications can't be generated." name; @@ -402,7 +402,7 @@ let find_predicate name = match Logic_env.find_all_logic_functions name with | f :: _q -> f (* TODO: should we warn in case of overloading? *) | [] -> - Self.warning ~once:true + Self.warning ~once:true ~wkey:wkey_libc_framac "Unable to locate ACSL predicate %s which should be in the Frama-C LibC. \ Correct specifications can't be generated." name; @@ -428,7 +428,7 @@ let find_predicate_by_width typ narrow_name wide_name = Cil.theMachine.Cil.wcharType -> find_predicate wide_name | _ -> - Self.warning ~current:true + Self.warning ~current:true ~wkey:wkey_typing "expected single/wide character pointer type, got %a (%a, unrolled %a)" Printer.pp_typ typ Cil_types_debug.pp_typ typ Cil_types_debug.pp_typ (Cil.unrollTypeDeep typ); raise Not_found @@ -705,7 +705,7 @@ let infer_format_from_args vf format_fun args = | ScanfLike -> if not (Cil.isPointerType t) then begin let source = fst arg.eloc in - Self.warning ~source + Self.warning ~source ~wkey:wkey_typing "Expecting pointer as parameter of scanf function. \ Argument %a has type %a" Printer.pp_exp arg Printer.pp_typ t; diff --git a/src/plugins/variadic/tests/declared/oracle/redefine_anonymous_parameters.res.oracle b/src/plugins/variadic/tests/declared/oracle/redefine_anonymous_parameters.res.oracle index a3ae37824e70ec189082e1368363eb76d20f02ed..5f6d9b83b39ca3b27a73673886aca4144df0820e 100644 --- a/src/plugins/variadic/tests/declared/oracle/redefine_anonymous_parameters.res.oracle +++ b/src/plugins/variadic/tests/declared/oracle/redefine_anonymous_parameters.res.oracle @@ -1,7 +1,9 @@ [variadic] redefine_anonymous_parameters.i:1: Declaration of variadic function printf. -[variadic] Warning: Unable to locate ACSL predicate valid_read_string which should be in the Frama-C LibC. Correct specifications can't be generated. -[variadic] Warning: Unable to locate global __fc_stdout which should be in the Frama-C LibC. Correct specifications can't be generated. +[variadic:libc:frama-c] Warning: + Unable to locate ACSL predicate valid_read_string which should be in the Frama-C LibC. Correct specifications can't be generated. +[variadic:libc:frama-c] Warning: + Unable to locate global __fc_stdout which should be in the Frama-C LibC. Correct specifications can't be generated. [variadic] redefine_anonymous_parameters.i:4: Translating call to printf to a call to the specialized version printf_va_1. [eva] Analyzing a complete application starting at main diff --git a/src/plugins/variadic/tests/defined/oracle/va_arg_cast.res.oracle b/src/plugins/variadic/tests/defined/oracle/va_arg_cast.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..7d4f6bbe42c510298deabb8bccb7d78cd06e7efb --- /dev/null +++ b/src/plugins/variadic/tests/defined/oracle/va_arg_cast.res.oracle @@ -0,0 +1,52 @@ +[kernel:parser:decimal-float] va_arg_cast.c:17: Warning: + Floating-point constant 7.1 is not represented exactly. Will use 0x1.c666666666666p2. + (warn-once: no further messages from category 'parser:decimal-float' will be emitted) +[variadic] va_arg_cast.c:10: Declaration of variadic function c. +[variadic] va_arg_cast.c:17: Generic translation of call to variadic function. +[eva] Analyzing a complete application starting at main +[eva] Computing initial state +[eva] Initial state computed +[eva] done for function main +[eva] ====== VALUES COMPUTED ====== +[eva:final-states] Values at end of function b: + a ∈ {4619679907765970542} + ap ∈ {{ &__va_args[2] }} +[eva:final-states] Values at end of function c: + a ∈ {4619679907765970542} + ap ∈ {{ &__va_args[0] }} +[eva:final-states] Values at end of function main: + a ∈ {4619679907765970542} +/* Generated by Frama-C */ +#include "stdarg.h" +long a; +void b(va_list ap) +{ + long tmp; + a = (long)*((double *)*ap); + ap ++; + tmp = *((long *)*ap); + ap ++; + a += tmp; + return; +} + +void c(int d, void * const *__va_params) +{ + va_list ap; + ap = __va_params; + b(ap); + return; +} + +void main(void) +{ + { + double __va_arg0 = 8.1; + double __va_arg1 = 7.1; + void *__va_args[2] = {& __va_arg0, & __va_arg1}; + c(0,(void * const *)(__va_args)); + } + return; +} + + diff --git a/src/plugins/variadic/tests/defined/va_arg_cast.c b/src/plugins/variadic/tests/defined/va_arg_cast.c new file mode 100644 index 0000000000000000000000000000000000000000..0f643ab62247c7385929df1b2c5b6f45d1e5825c --- /dev/null +++ b/src/plugins/variadic/tests/defined/va_arg_cast.c @@ -0,0 +1,18 @@ +#include <stdarg.h> + +long a; + +void b(va_list ap) { + a = va_arg(ap, double); + a += va_arg(ap, long); +} + +void c(int d, ...) { + va_list ap; + va_start(ap, d); + b(ap); +} + +void main() { + c(0, 8.1, 7.1); +} diff --git a/src/plugins/variadic/tests/erroneous/oracle/exec.res.oracle b/src/plugins/variadic/tests/erroneous/oracle/exec.res.oracle index 0bf7155503813b37a2b28e08e6bd1d05a6360b7d..085bd49daedba21356626eea68d343d1c78c6d25 100644 --- a/src/plugins/variadic/tests/erroneous/oracle/exec.res.oracle +++ b/src/plugins/variadic/tests/erroneous/oracle/exec.res.oracle @@ -4,16 +4,16 @@ Declaration of variadic function execle. [variadic] FRAMAC_SHARE/libc/unistd.h:810: Declaration of variadic function execlp. -[variadic] exec.c:5: Warning: +[variadic:typing] exec.c:5: Warning: Incorrect type for argument 3. The argument will be cast from int to char *. [variadic] exec.c:5: Translating call to execl to a call to execv. [variadic] exec.c:7: Warning: Failed to find a sentinel (NULL pointer) in the argument list. [variadic] exec.c:7: Fallback translation of call execlp to a call to the specialized version execlp_fallback_1. -[variadic] exec.c:9: Warning: Not enough arguments: expected 5, given 4. +[variadic:typing] exec.c:9: Warning: Not enough arguments: expected 5, given 4. [variadic] exec.c:9: Fallback translation of call execle to a call to the specialized version execle_fallback_1. -[variadic] exec.c:11: Warning: +[variadic:typing] exec.c:11: Warning: Incorrect type for argument 5. The argument will be cast from int to char * const *. [variadic] exec.c:11: Translating call to execle to a call to execve. diff --git a/src/plugins/variadic/tests/erroneous/oracle/invalid_libc.res.oracle b/src/plugins/variadic/tests/erroneous/oracle/invalid_libc.res.oracle index c830fa3b1f625ba9217e8984e852683ba2e6bc94..e0a425d9a522742865dbbcf435854912b0400b32 100644 --- a/src/plugins/variadic/tests/erroneous/oracle/invalid_libc.res.oracle +++ b/src/plugins/variadic/tests/erroneous/oracle/invalid_libc.res.oracle @@ -1,5 +1,5 @@ [variadic] invalid_libc.i:2: Declaration of variadic function fprintf. -[variadic] invalid_libc.i:2: Warning: +[variadic:libc] invalid_libc.i:2: Warning: The standard function fprintf was expected to have at least 2 fixed parameters but only has 1. No variadic translation will be performed. [variadic] invalid_libc.i:6: Generic translation of call to variadic function. diff --git a/src/plugins/variadic/tests/erroneous/oracle/no-libc.res.oracle b/src/plugins/variadic/tests/erroneous/oracle/no-libc.res.oracle index 6f2256ced8458c2138a064fe059fd90219d985e2..3178a54947e82a2d3e3dc1824a867b3acd5b4ea7 100644 --- a/src/plugins/variadic/tests/erroneous/oracle/no-libc.res.oracle +++ b/src/plugins/variadic/tests/erroneous/oracle/no-libc.res.oracle @@ -1,5 +1,7 @@ [variadic] no-libc.i:1: Declaration of variadic function printf. -[variadic] Warning: Unable to locate ACSL predicate valid_read_string which should be in the Frama-C LibC. Correct specifications can't be generated. -[variadic] Warning: Unable to locate global __fc_stdout which should be in the Frama-C LibC. Correct specifications can't be generated. +[variadic:libc:frama-c] Warning: + Unable to locate ACSL predicate valid_read_string which should be in the Frama-C LibC. Correct specifications can't be generated. +[variadic:libc:frama-c] Warning: + Unable to locate global __fc_stdout which should be in the Frama-C LibC. Correct specifications can't be generated. [variadic] no-libc.i:5: Translating call to printf to a call to the specialized version printf_va_1. diff --git a/src/plugins/variadic/tests/erroneous/oracle/printf.res.oracle b/src/plugins/variadic/tests/erroneous/oracle/printf.res.oracle index b22f9025dba1794583d2b6b9793a200e1e4de061..38a9205c37681345f2ef4f597763ff0a18e63a62 100644 --- a/src/plugins/variadic/tests/erroneous/oracle/printf.res.oracle +++ b/src/plugins/variadic/tests/erroneous/oracle/printf.res.oracle @@ -16,8 +16,8 @@ Declaration of variadic function dprintf. [variadic] FRAMAC_SHARE/libc/stdio.h:590: Declaration of variadic function asprintf. -[variadic] printf.c:8: Warning: Multiple usage of flag '-'. -[variadic] printf.c:8: Warning: +[variadic:libc:format] printf.c:8: Warning: Multiple usage of flag '-'. +[variadic:libc:format] printf.c:8: Warning: Flag ' ' and conversion specififer e are not compatibles. [variadic] printf.c:8: Fallback translation of call printf to a call to the specialized version printf_fallback_1. diff --git a/src/plugins/variadic/tests/erroneous/oracle/va_arg-wrongtype.res.oracle b/src/plugins/variadic/tests/erroneous/oracle/va_arg-wrongtype.res.oracle index ff77e4725d8caba6826723de769b2d76696e7180..b51862515dfbc25c6f665c5c941b398d1c347736 100644 --- a/src/plugins/variadic/tests/erroneous/oracle/va_arg-wrongtype.res.oracle +++ b/src/plugins/variadic/tests/erroneous/oracle/va_arg-wrongtype.res.oracle @@ -1,5 +1,5 @@ [variadic] va_arg-wrongtype.c:3: Declaration of variadic function sum. -[variadic] va_arg-wrongtype.c:9: Warning: +[variadic:typing] va_arg-wrongtype.c:9: Warning: Wrong type argument in va_start: short is promoted to int when used in the variadic part of the arguments. (You should pass int to va_start) [variadic] va_arg-wrongtype.c:18: Generic translation of call to variadic function. diff --git a/src/plugins/variadic/tests/known/oracle/exec.res.oracle b/src/plugins/variadic/tests/known/oracle/exec.res.oracle index 279def5dd329b2c2ec067de2d47ca86e07d0a7f4..d8d3c2140b9386b1b0c6a2afaf849ff544614822 100644 --- a/src/plugins/variadic/tests/known/oracle/exec.res.oracle +++ b/src/plugins/variadic/tests/known/oracle/exec.res.oracle @@ -5,13 +5,13 @@ [variadic] FRAMAC_SHARE/libc/unistd.h:810: Declaration of variadic function execlp. [variadic] exec.c:9: Translating call to execle to a call to execve. -[variadic] exec.c:11: Warning: +[variadic:typing] exec.c:11: Warning: Too many arguments: expected 5, given 6. Superfluous arguments will be removed. [variadic] exec.c:11: Translating call to execl to a call to execv. -[variadic] exec.c:12: Warning: +[variadic:typing] exec.c:12: Warning: Too many arguments: expected 4, given 5. Superfluous arguments will be removed. [variadic] exec.c:12: Translating call to execlp to a call to execvp. -[variadic] exec.c:13: Warning: +[variadic:typing] exec.c:13: Warning: Too many arguments: expected 4, given 6. Superfluous arguments will be removed. [variadic] exec.c:13: Translating call to execle to a call to execve. [variadic] exec.c:15: Warning: diff --git a/src/plugins/variadic/tests/known/oracle/fcntl.res.oracle b/src/plugins/variadic/tests/known/oracle/fcntl.res.oracle index 9d0262aed46f6d6b2869db34f08acdd4d116a738..ff5a912894d02533eca168e09c1a0d527f8aa8ef 100644 --- a/src/plugins/variadic/tests/known/oracle/fcntl.res.oracle +++ b/src/plugins/variadic/tests/known/oracle/fcntl.res.oracle @@ -1,7 +1,7 @@ -[variadic] FRAMAC_SHARE/libc/fcntl.h:118: +[variadic] FRAMAC_SHARE/libc/fcntl.h:121: Declaration of variadic function fcntl. -[variadic] FRAMAC_SHARE/libc/fcntl.h:121: Declaration of variadic function open. -[variadic] FRAMAC_SHARE/libc/fcntl.h:128: +[variadic] FRAMAC_SHARE/libc/fcntl.h:124: Declaration of variadic function open. +[variadic] FRAMAC_SHARE/libc/fcntl.h:131: Declaration of variadic function openat. [variadic] fcntl.c:8: Translating call to the specialized version fcntl(int, int). @@ -9,7 +9,7 @@ Translating call to the specialized version fcntl(int, int, int). [variadic] fcntl.c:10: Translating call to the specialized version fcntl(int, int, struct flock *). -[variadic] fcntl.c:16: Warning: +[variadic:prototype] fcntl.c:16: Warning: No matching prototype found for this call to fcntl. Expected candidates: fcntl(int, int) @@ -23,7 +23,7 @@ Translating call to the specialized version fcntl(int, int). [variadic] fcntl.c:24: Translating call to the specialized version fcntl(int, int, struct flock *). -[variadic] fcntl.c:28: Warning: +[variadic:prototype] fcntl.c:28: Warning: No matching prototype found for this call to fcntl. Expected candidates: fcntl(int, int) diff --git a/src/plugins/variadic/tests/known/oracle/open.res.oracle b/src/plugins/variadic/tests/known/oracle/open.res.oracle index 5702001954cb309a157ee842d7cde3c102424758..9b5c71ca58f9f5128de42393fbd4e864502a471e 100644 --- a/src/plugins/variadic/tests/known/oracle/open.res.oracle +++ b/src/plugins/variadic/tests/known/oracle/open.res.oracle @@ -1,15 +1,15 @@ -[variadic] FRAMAC_SHARE/libc/fcntl.h:118: +[variadic] FRAMAC_SHARE/libc/fcntl.h:121: Declaration of variadic function fcntl. -[variadic] FRAMAC_SHARE/libc/fcntl.h:121: Declaration of variadic function open. -[variadic] FRAMAC_SHARE/libc/fcntl.h:128: +[variadic] FRAMAC_SHARE/libc/fcntl.h:124: Declaration of variadic function open. +[variadic] FRAMAC_SHARE/libc/fcntl.h:131: Declaration of variadic function openat. [variadic] open.c:7: Translating call to the specialized version open(char const *, int, mode_t). -[variadic] open.c:7: Warning: +[variadic:typing] open.c:7: Warning: Incorrect type for argument 3. The argument will be cast from int to mode_t. [variadic] open.c:8: Translating call to the specialized version open(char const *, int). -[variadic] open.c:9: Warning: +[variadic:prototype] open.c:9: Warning: No matching prototype found for this call to open. Expected candidates: open(char const *, int) diff --git a/src/plugins/variadic/tests/known/oracle/open_wrong.res.oracle b/src/plugins/variadic/tests/known/oracle/open_wrong.res.oracle index ea5a7b2c33209a57f5432a405582b78bf96e56e4..1f4b8a7cd11d50816dc9c19df5ed3ca045374332 100644 --- a/src/plugins/variadic/tests/known/oracle/open_wrong.res.oracle +++ b/src/plugins/variadic/tests/known/oracle/open_wrong.res.oracle @@ -1,9 +1,9 @@ -[variadic] FRAMAC_SHARE/libc/fcntl.h:118: +[variadic] FRAMAC_SHARE/libc/fcntl.h:121: Declaration of variadic function fcntl. -[variadic] FRAMAC_SHARE/libc/fcntl.h:121: Declaration of variadic function open. -[variadic] FRAMAC_SHARE/libc/fcntl.h:128: +[variadic] FRAMAC_SHARE/libc/fcntl.h:124: Declaration of variadic function open. +[variadic] FRAMAC_SHARE/libc/fcntl.h:131: Declaration of variadic function openat. -[variadic] open_wrong.c:13: Warning: +[variadic:prototype] open_wrong.c:13: Warning: No matching prototype found for this call to open. Expected candidates: open(char const *, int) diff --git a/src/plugins/variadic/tests/known/oracle/openat.res.oracle b/src/plugins/variadic/tests/known/oracle/openat.res.oracle index 2c5a0f9da014e84b2edeeb181838a7a7970e6925..8773e0e6c29669613ecb4e1374358be7111482a7 100644 --- a/src/plugins/variadic/tests/known/oracle/openat.res.oracle +++ b/src/plugins/variadic/tests/known/oracle/openat.res.oracle @@ -1,15 +1,15 @@ -[variadic] FRAMAC_SHARE/libc/fcntl.h:118: +[variadic] FRAMAC_SHARE/libc/fcntl.h:121: Declaration of variadic function fcntl. -[variadic] FRAMAC_SHARE/libc/fcntl.h:121: Declaration of variadic function open. -[variadic] FRAMAC_SHARE/libc/fcntl.h:128: +[variadic] FRAMAC_SHARE/libc/fcntl.h:124: Declaration of variadic function open. +[variadic] FRAMAC_SHARE/libc/fcntl.h:131: Declaration of variadic function openat. [variadic] openat.c:8: Translating call to the specialized version openat(int, char const *, int, mode_t). [variadic] openat.c:9: Translating call to the specialized version openat(int, char const *, int, mode_t). -[variadic] openat.c:9: Warning: +[variadic:typing] openat.c:9: Warning: Incorrect type for argument 4. The argument will be cast from int to mode_t. -[variadic] openat.c:10: Warning: +[variadic:prototype] openat.c:10: Warning: No matching prototype found for this call to openat. Expected candidates: openat(int, char const *, int) diff --git a/src/plugins/variadic/tests/known/oracle/printf.res.oracle b/src/plugins/variadic/tests/known/oracle/printf.res.oracle index e6143dde67e0b9a42e104d3b0b83931442bc25b5..995179fa65850170b1a1852836dd5c0a286b0c6a 100644 --- a/src/plugins/variadic/tests/known/oracle/printf.res.oracle +++ b/src/plugins/variadic/tests/known/oracle/printf.res.oracle @@ -80,7 +80,7 @@ Translating call to printf to a call to the specialized version printf_va_25. [variadic] printf.c:69: Translating call to printf to a call to the specialized version printf_va_26. -[variadic] printf.c:71: Warning: +[variadic:libc:format] printf.c:71: Warning: Flag ' ' and conversion specififer x are not compatibles. [variadic] printf.c:71: Fallback translation of call printf to a call to the specialized version printf_fallback_1. @@ -170,7 +170,6 @@ #include "stdlib.h" #include "string.h" #include "strings.h" -#include "sys/types.h" #include "time.h" #include "wchar.h" /*@ requires valid_read_string(format); diff --git a/src/plugins/variadic/tests/known/oracle/printf_redefined.res.oracle b/src/plugins/variadic/tests/known/oracle/printf_redefined.res.oracle index 1ff7860624147066f1690732686cd5674ee8335a..abc776ec38f3d3ae6fbb115af575915cdca048ea 100644 --- a/src/plugins/variadic/tests/known/oracle/printf_redefined.res.oracle +++ b/src/plugins/variadic/tests/known/oracle/printf_redefined.res.oracle @@ -1,9 +1,11 @@ [variadic] printf_redefined.i:3: Declaration of variadic function printf. -[variadic] Warning: Unable to locate ACSL predicate valid_read_string which should be in the Frama-C LibC. Correct specifications can't be generated. -[variadic] Warning: Unable to locate global __fc_stdout which should be in the Frama-C LibC. Correct specifications can't be generated. +[variadic:libc:frama-c] Warning: + Unable to locate ACSL predicate valid_read_string which should be in the Frama-C LibC. Correct specifications can't be generated. +[variadic:libc:frama-c] Warning: + Unable to locate global __fc_stdout which should be in the Frama-C LibC. Correct specifications can't be generated. [variadic] printf_redefined.i:7: Translating call to printf to a call to the specialized version printf_va_1. -[variadic] printf_redefined.i:7: Warning: +[variadic:typing] printf_redefined.i:7: Warning: Incorrect type for argument 2. The argument will be cast from long to size_t. [eva] Analyzing a complete application starting at main [eva] Computing initial state diff --git a/src/plugins/variadic/tests/known/oracle/printf_wrong_arity.res.oracle b/src/plugins/variadic/tests/known/oracle/printf_wrong_arity.res.oracle index c966edbc370fcfa9931b8543bdcca3d12deccf87..35de0b879c14ee9c6eddf3bfd0f3f0c70931e104 100644 --- a/src/plugins/variadic/tests/known/oracle/printf_wrong_arity.res.oracle +++ b/src/plugins/variadic/tests/known/oracle/printf_wrong_arity.res.oracle @@ -18,11 +18,11 @@ Declaration of variadic function asprintf. [variadic] printf_wrong_arity.c:8: Translating call to printf to a call to the specialized version printf_va_1. -[variadic] printf_wrong_arity.c:8: Warning: +[variadic:typing] printf_wrong_arity.c:8: Warning: Too many arguments: expected 2, given 3. Superfluous arguments will be removed. [variadic] printf_wrong_arity.c:9: Translating call to printf to a call to the specialized version printf_va_2. -[variadic] printf_wrong_arity.c:9: Warning: +[variadic:typing] printf_wrong_arity.c:9: Warning: Not enough arguments: expected 3, given 2. [variadic] printf_wrong_arity.c:9: Fallback translation of call printf to a call to the specialized version printf_va_2_fallback_1. @@ -47,7 +47,6 @@ #include "stdio.c" #include "stdio.h" #include "stdlib.h" -#include "sys/types.h" /*@ requires valid_read_string(format); assigns \result, __fc_stdout->__fc_FILE_data; assigns \result diff --git a/src/plugins/variadic/tests/known/oracle/printf_wrong_types.res.oracle b/src/plugins/variadic/tests/known/oracle/printf_wrong_types.res.oracle index b1028e13ef6ba60d653ab15e6613988822637d94..14b7c5c54a5649abc9300193ae62421ea2bbd68f 100644 --- a/src/plugins/variadic/tests/known/oracle/printf_wrong_types.res.oracle +++ b/src/plugins/variadic/tests/known/oracle/printf_wrong_types.res.oracle @@ -20,61 +20,61 @@ Translating call to printf to a call to the specialized version printf_va_1. [variadic] printf_wrong_types.c:19: Translating call to printf to a call to the specialized version printf_va_2. -[variadic] printf_wrong_types.c:19: Warning: +[variadic:typing] printf_wrong_types.c:19: Warning: Incorrect type for argument 2. The argument will be cast from unsigned int to int. [variadic] printf_wrong_types.c:20: Translating call to printf to a call to the specialized version printf_va_3. -[variadic] printf_wrong_types.c:20: Warning: +[variadic:typing] printf_wrong_types.c:20: Warning: Incorrect type for argument 2. The argument will be cast from int to unsigned int. [variadic] printf_wrong_types.c:21: Translating call to printf to a call to the specialized version printf_va_4. -[variadic] printf_wrong_types.c:21: Warning: +[variadic:typing] printf_wrong_types.c:21: Warning: Incorrect type for argument 2. The argument will be cast from int to long. [variadic] printf_wrong_types.c:22: Translating call to printf to a call to the specialized version printf_va_5. -[variadic] printf_wrong_types.c:22: Warning: +[variadic:typing] printf_wrong_types.c:22: Warning: Incorrect type for argument 2. The argument will be cast from long to int. [variadic] printf_wrong_types.c:23: Translating call to printf to a call to the specialized version printf_va_6. -[variadic] printf_wrong_types.c:23: Warning: +[variadic:typing] printf_wrong_types.c:23: Warning: Incorrect type for argument 2. The argument will be cast from unsigned int to unsigned long. [variadic] printf_wrong_types.c:24: Translating call to printf to a call to the specialized version printf_va_7. -[variadic] printf_wrong_types.c:24: Warning: +[variadic:typing] printf_wrong_types.c:24: Warning: Incorrect type for argument 2. The argument will be cast from unsigned long to unsigned int. [variadic] printf_wrong_types.c:25: Translating call to printf to a call to the specialized version printf_va_8. -[variadic] printf_wrong_types.c:25: Warning: +[variadic:typing] printf_wrong_types.c:25: Warning: Incorrect type for argument 2. The argument will be cast from unsigned int to void *. [variadic] printf_wrong_types.c:26: Translating call to printf to a call to the specialized version printf_va_9. [variadic] printf_wrong_types.c:27: Translating call to printf to a call to the specialized version printf_va_10. -[variadic] printf_wrong_types.c:27: Warning: +[variadic:typing] printf_wrong_types.c:27: Warning: Incorrect type for argument 2. The argument will be cast from long double to double. [variadic] printf_wrong_types.c:28: Translating call to printf to a call to the specialized version printf_va_11. -[variadic] printf_wrong_types.c:28: Warning: +[variadic:typing] printf_wrong_types.c:28: Warning: Incorrect type for argument 2. The argument will be cast from long double to double. [variadic] printf_wrong_types.c:29: Translating call to printf to a call to the specialized version printf_va_12. -[variadic] printf_wrong_types.c:29: Warning: +[variadic:typing] printf_wrong_types.c:29: Warning: Incorrect type for argument 2. The argument will be cast from double to long double. [variadic] printf_wrong_types.c:30: Translating call to printf to a call to the specialized version printf_va_13. -[variadic] printf_wrong_types.c:30: Warning: +[variadic:typing] printf_wrong_types.c:30: Warning: Incorrect type for argument 2. The argument will be cast from int to char *. [variadic] printf_wrong_types.c:31: Translating call to printf to a call to the specialized version printf_va_14. -[variadic] printf_wrong_types.c:31: Warning: +[variadic:typing] printf_wrong_types.c:31: Warning: Incorrect type for argument 2. The argument will be cast from char * to int. [variadic] printf_wrong_types.c:35: Translating call to printf to a call to the specialized version printf_va_15. -[variadic] printf_wrong_types.c:35: Warning: +[variadic:typing] printf_wrong_types.c:35: Warning: Possible portability issues with enum type for argument 2 (use -variadic-no-strict to avoid this warning). [variadic] printf_wrong_types.c:36: Translating call to printf to a call to the specialized version printf_va_16. -[variadic] printf_wrong_types.c:36: Warning: +[variadic:typing] printf_wrong_types.c:36: Warning: Incorrect type for argument 2. The argument will be cast from RC (unsigned int) to int. [eva] Analyzing a complete application starting at main [eva] Computing initial state @@ -434,59 +434,59 @@ int main(void) Translating call to printf to a call to the specialized version printf_va_1. [variadic] printf_wrong_types.c:19: Translating call to printf to a call to the specialized version printf_va_2. -[variadic] printf_wrong_types.c:19: Warning: +[variadic:typing] printf_wrong_types.c:19: Warning: Incorrect type for argument 2. The argument will be cast from unsigned int to int. [variadic] printf_wrong_types.c:20: Translating call to printf to a call to the specialized version printf_va_3. -[variadic] printf_wrong_types.c:20: Warning: +[variadic:typing] printf_wrong_types.c:20: Warning: Incorrect type for argument 2. The argument will be cast from int to unsigned int. [variadic] printf_wrong_types.c:21: Translating call to printf to a call to the specialized version printf_va_4. -[variadic] printf_wrong_types.c:21: Warning: +[variadic:typing] printf_wrong_types.c:21: Warning: Incorrect type for argument 2. The argument will be cast from int to long. [variadic] printf_wrong_types.c:22: Translating call to printf to a call to the specialized version printf_va_5. -[variadic] printf_wrong_types.c:22: Warning: +[variadic:typing] printf_wrong_types.c:22: Warning: Incorrect type for argument 2. The argument will be cast from long to int. [variadic] printf_wrong_types.c:23: Translating call to printf to a call to the specialized version printf_va_6. -[variadic] printf_wrong_types.c:23: Warning: +[variadic:typing] printf_wrong_types.c:23: Warning: Incorrect type for argument 2. The argument will be cast from unsigned int to unsigned long. [variadic] printf_wrong_types.c:24: Translating call to printf to a call to the specialized version printf_va_7. -[variadic] printf_wrong_types.c:24: Warning: +[variadic:typing] printf_wrong_types.c:24: Warning: Incorrect type for argument 2. The argument will be cast from unsigned long to unsigned int. [variadic] printf_wrong_types.c:25: Translating call to printf to a call to the specialized version printf_va_8. -[variadic] printf_wrong_types.c:25: Warning: +[variadic:typing] printf_wrong_types.c:25: Warning: Incorrect type for argument 2. The argument will be cast from unsigned int to void *. [variadic] printf_wrong_types.c:26: Translating call to printf to a call to the specialized version printf_va_9. [variadic] printf_wrong_types.c:27: Translating call to printf to a call to the specialized version printf_va_10. -[variadic] printf_wrong_types.c:27: Warning: +[variadic:typing] printf_wrong_types.c:27: Warning: Incorrect type for argument 2. The argument will be cast from long double to double. [variadic] printf_wrong_types.c:28: Translating call to printf to a call to the specialized version printf_va_11. -[variadic] printf_wrong_types.c:28: Warning: +[variadic:typing] printf_wrong_types.c:28: Warning: Incorrect type for argument 2. The argument will be cast from long double to double. [variadic] printf_wrong_types.c:29: Translating call to printf to a call to the specialized version printf_va_12. -[variadic] printf_wrong_types.c:29: Warning: +[variadic:typing] printf_wrong_types.c:29: Warning: Incorrect type for argument 2. The argument will be cast from double to long double. [variadic] printf_wrong_types.c:30: Translating call to printf to a call to the specialized version printf_va_13. -[variadic] printf_wrong_types.c:30: Warning: +[variadic:typing] printf_wrong_types.c:30: Warning: Incorrect type for argument 2. The argument will be cast from int to char *. [variadic] printf_wrong_types.c:31: Translating call to printf to a call to the specialized version printf_va_14. -[variadic] printf_wrong_types.c:31: Warning: +[variadic:typing] printf_wrong_types.c:31: Warning: Incorrect type for argument 2. The argument will be cast from char * to int. [variadic] printf_wrong_types.c:35: Translating call to printf to a call to the specialized version printf_va_15. [variadic] printf_wrong_types.c:36: Translating call to printf to a call to the specialized version printf_va_16. -[variadic] printf_wrong_types.c:36: Warning: +[variadic:typing] printf_wrong_types.c:36: Warning: Incorrect type for argument 2. The argument will be cast from RC (unsigned int) to int. [eva] Analyzing a complete application starting at main [eva] Computing initial state diff --git a/src/plugins/variadic/tests/known/oracle/scanf_wrong.res.oracle b/src/plugins/variadic/tests/known/oracle/scanf_wrong.res.oracle index eb258278992cde8aa8c15de5065f3322c83a910f..56a0358892b3575428cb56d25b94cc223a1f1e09 100644 --- a/src/plugins/variadic/tests/known/oracle/scanf_wrong.res.oracle +++ b/src/plugins/variadic/tests/known/oracle/scanf_wrong.res.oracle @@ -18,7 +18,7 @@ Declaration of variadic function asprintf. [variadic] scanf_wrong.c:8: Translating call to scanf to a call to the specialized version scanf_va_1. -[variadic] scanf_wrong.c:8: Warning: +[variadic:typing] scanf_wrong.c:8: Warning: Incorrect type for argument 2. The argument will be cast from double to char *. [eva] Analyzing a complete application starting at main [eva] Computing initial state diff --git a/src/plugins/wp/.gitignore b/src/plugins/wp/.gitignore index 6f6f4289b01e7f2d93bc1e30518c98846c37b47a..7910a839f2d78300306bf93762c248d1bcc1581c 100644 --- a/src/plugins/wp/.gitignore +++ b/src/plugins/wp/.gitignore @@ -12,8 +12,6 @@ /tests/*/oracle_*/dune /tests/*/result /tests/*/result_* -/tests/*/*.sav -/tests/*/*.out /doc/*/.make-class /doc/*/.make-icons diff --git a/src/plugins/wp/Cfloat.ml b/src/plugins/wp/Cfloat.ml index 5f5c5ad8df01dd8e53c3756ee62c26eae3b72846..7dd70297684fa32b6293c1f90e365419fa3a98d4 100644 --- a/src/plugins/wp/Cfloat.ml +++ b/src/plugins/wp/Cfloat.ml @@ -48,7 +48,7 @@ let ftau = function let ft_suffix = function Float32 -> "f32" | Float64 -> "f64" let pp_suffix fmt ft = Format.pp_print_string fmt (ft_suffix ft) -let link phi = Lang.infoprover (Qed.Engine.F_call phi) +let link phi = Qed.Engine.F_call phi (* Qed exact representations, linked to f32/f64 *) let fq32 = extern_f ~library ~result:t32 ~link:(link "to_f32") "q32" diff --git a/src/plugins/wp/Changelog b/src/plugins/wp/Changelog index 0da478f24ee96dd84251cc6b669007284fdcad64..fa43cadb13d8455a11d8ba92271d37daaad562c6 100644 --- a/src/plugins/wp/Changelog +++ b/src/plugins/wp/Changelog @@ -24,9 +24,15 @@ Plugin WP <next-release> ######################## +- WP [2022-01-25] Removed deprecated "native:coq" prover +- WP [2022-01-25] Removed deprecated "native:alt-ergo" prover +- WP [2022-01-10] Supported general variant measure +- WP [2022-01-10] Supported decreases clause +- TIP [2022-01-10] New tactic Mod-Mask: rewrite bitmask into/from modulo - TIP [2022-01-05] New tactic Clear: remove hypothesis --* WP [2022-01-05] Fix loop invariant order -- WP [2022-01-05] Weaken check loop invariant +-* WP [2022-01-05] Fixed loop invariant order +- WP [2022-01-05] Weakened loop invariant verification (in particular + for check loop invariant) - TIP [2021-11-30] Extended Split tactic: can split in hypotheses, can split conjunctions into multiple hypotheses. - WP [2021-11-08] Removed legacy WP engine and option -wp-legacy diff --git a/src/plugins/wp/Cint.ml b/src/plugins/wp/Cint.ml index dbf2df8ce7a15614a2235f8fd11fea846bf7d5be..65ff69a9b88586d14ad5200049359a688a392bb6 100644 --- a/src/plugins/wp/Cint.ml +++ b/src/plugins/wp/Cint.ml @@ -126,17 +126,37 @@ let match_integer t = | Logic.Kint c -> c | _ -> raise Not_found +let match_to_cint t = + match F.repr t with + | Logic.Fun( conv , [a] ) -> (to_cint conv), a + | _ -> raise Not_found + +let match_mod t = + match F.repr t with + | Logic.Mod (e1, e2) -> e1, e2 + | _ -> raise Not_found + +(* integration with qed should be improved! *) +let is_positive t = + match F.repr t with + | Logic.Kint c -> Integer.le Integer.one c + | _ -> false + (* integration with qed should be improved! *) let rec is_positive_or_null e = match F.repr e with | Logic.Fun( f , [e] ) when Fun.equal f f_lnot -> is_negative e | Logic.Fun( f , es ) when Fun.equal f f_land -> List.exists is_positive_or_null es | Logic.Fun( f , es ) when Fun.equal f f_lor -> List.for_all is_positive_or_null es - | Logic.Fun( f , es ) when Fun.equal f f_lxor -> (match xor_sign es with | Some b -> b | _ -> false) + | Logic.Fun( f , es ) when Fun.equal f f_lxor -> (match mul_xor_sign es with | Some b -> b | _ -> false) | Logic.Fun( f , es ) when Fun.equal f f_lsr || Fun.equal f f_lsl -> List.for_all is_positive_or_null es | _ -> (* try some improvement first then ask to qed *) let improved_is_positive_or_null e = match F.repr e with | Logic.Add es -> List.for_all is_positive_or_null es + | Logic.Mul es -> (match mul_xor_sign es with | Some b -> b | _ -> false) + | Logic.Mod(e1,e2) when is_positive e2 || is_negative e2 -> + (* e2<>0 ==> ( 0<=(e1 % e2) <=> 0<=e1 ) *) + is_positive_or_null e1 | _ -> false in if improved_is_positive_or_null e then true else match F.is_true (F.e_leq e_zero e) with @@ -144,20 +164,21 @@ let rec is_positive_or_null e = match F.repr e with | Logic.No | Logic.Maybe -> false and is_negative e = match F.repr e with | Logic.Fun( f , [e] ) when Fun.equal f f_lnot -> is_positive_or_null e - | Logic.Fun( f , es ) when Fun.equal f f_lor -> List.exists is_negative es - | Logic.Fun( f , es ) when Fun.equal f f_land -> List.for_all is_negative es - | Logic.Fun( f , es ) when Fun.equal f f_lxor -> (match xor_sign es with | Some b -> (not b) | _ -> false) + | Logic.Fun( f , es ) when Fun.equal f f_lor -> List.exists is_negative es + | Logic.Fun( f , es ) when Fun.equal f f_land -> List.for_all is_negative es + | Logic.Fun( f , es ) when Fun.equal f f_lxor -> (match mul_xor_sign es with | Some b -> (not b) | _ -> false) | Logic.Fun( f , [k;n] ) when Fun.equal f f_lsr || Fun.equal f f_lsl -> is_positive_or_null n && is_negative k | _ -> (* try some improvement first then ask to qed *) let improved_is_negative e = match F.repr e with | Logic.Add es -> List.for_all is_negative es + | Logic.Mul es -> (match mul_xor_sign es with | Some b -> (not b) | _ -> false) | _ -> false in if improved_is_negative e then true else match F.is_true (F.e_lt e e_zero) with | Logic.Yes -> true | Logic.No | Logic.Maybe -> false -and xor_sign es = try +and mul_xor_sign es = try Some (List.fold_left (fun acc e -> if is_positive_or_null e then acc (* as previous *) else if is_negative e then (not acc) (* opposite sign *) @@ -168,7 +189,7 @@ let match_positive_or_null e = if not (is_positive_or_null e) then raise Not_found; e -let match_power2, _match_power2_minus1 = +let match_power2, match_power2_minus1 = let highest_bit_number = let hsb p = if p land 2 = 0 then 0 else 1 in let hsb p = let n = p lsr 2 in if n = 0 then hsb p else 2 + hsb n @@ -198,7 +219,7 @@ let match_power2, _match_power2_minus1 = in let match_power2_minus1 e = match F.repr e with | Logic.Kint z when is_power2 (Integer.succ z) -> e_zint (highest_bit_number (Integer.succ z)) - | _ -> raise Not_found + | _ -> match_power2 (e_add e_one e) in match_power2, match_power2_minus1 let match_fun op t = @@ -251,6 +272,7 @@ let match_positive_or_null_integer_arg2 = let match_integer_extraction = match_list_head match_integer let match_power2_extraction = match_list_extraction match_power2 +let match_power2_minus1_extraction = match_list_extraction match_power2_minus1 let match_binop_one_extraction binop = match_list_extraction (match_binop_one_arg1 binop) @@ -601,26 +623,65 @@ let smp_lnot = function (* --- Comparision with L-AND / L-OR / L-NOT --- *) (* -------------------------------------------------------------------------- *) -let smp_leq_with_land a b = - let es = match_fun f_land a in - let a1,_ = match_list_head match_positive_or_null_integer es in - if F.decide (F.e_leq (e_zint a1) b) +let smp_leq_improved f a b = + ignore (match_fun f b) ; (* It must be an improved of [is_positive_or_null f(args)] *) + (* a <= 0 && 0 <= f(args) *) + if F.decide (F.e_leq a F.e_zero) && is_positive_or_null b then e_true else raise Not_found +let smp_leq_with_land a b = + try + let es = match_fun f_land a in + let a1,_ = match_list_head match_positive_or_null_integer es in + if F.decide (F.e_leq (e_zint a1) b) + then e_true + else raise Not_found + with Not_found -> + (* a <= 0 && 0 <= (x&y) ==> a <= (x & y) *) + smp_leq_improved f_land a b + let smp_eq_with_land a b = let es = match_fun f_land a in try - let b1 = match_integer b in - try (* (b1&~a2)!=0 ==> (b1==(a2&e) <=> false) *) - let a2,_ = match_integer_extraction es in - if Integer.is_zero (Integer.logand b1 (Integer.lognot a2)) - then raise Not_found ; - e_false - with Not_found when b == e_minus_one -> - (* -1==(a1&a2) <=> (-1==a1 && -1==a2) *) - F.e_and (List.map (e_eq b) es) - with Not_found -> introduction_bit_test_positive es b + try + let b1 = match_integer b in + try (* (b1&~a2)!=0 ==> (b1==(a2&e) <=> false) *) + let a2,_ = match_integer_extraction es in + if Integer.is_zero (Integer.logand b1 (Integer.lognot a2)) + then raise Not_found ; + e_false + with Not_found when b == e_minus_one -> + (* -1==(a1&a2) <=> (-1==a1 && -1==a2) *) + F.e_and (List.map (e_eq b) es) + with Not_found -> introduction_bit_test_positive es b + with Not_found -> + try + (* k>=0 & b1>=0 ==> (b1 & ((1 << k) -1) == b1 % (1 << k) <==> true) *) + let b1,b2 = match_mod b in + let k = match_power2 b2 in + (* note: a positive or null k is required by match_power2, match_power2_minus1 *) + let k',_,es = match_power2_minus1_extraction es in + if not ((is_positive_or_null b1) && + (F.decide (F.e_eq k k')) && + (F.decide (F.e_eq b1 (F.e_fun f_land es)))) + then raise Not_found ; + F.e_true + with Not_found -> + (* k in {8,16,32,64} ==> (b1 & ((1 << k) -1) == to_cint_unsigned_bits(k, b1) <==> true *) + let iota,b1 = match_to_cint b in + if Ctypes.signed iota then raise Not_found ; + let n = Ctypes.i_bits iota in + if n = 1 then + (* rejects [to_bool()] that is not a modulo *) + raise Not_found ; + let k',_,es = match_power2_minus1_extraction es in + let k' = match_integer k' in + let k = Integer.of_int n in + if not ((Integer.equal k k') && + (F.decide (F.e_eq b1 (F.e_fun f_land es)))) + then raise Not_found ; + F.e_true let smp_eq_with_lor a b = let b1 = match_integer b in @@ -737,7 +798,11 @@ let smp_eq_with_lsl a b = try smp_eq_with_lsl_cst a b with Not_found -> smp_cmp_with_lsl e_eq a b -let smp_leq_with_lsl a0 b0 = smp_cmp_with_lsl e_leq a0 b0 +let smp_leq_with_lsl a b = + try smp_cmp_with_lsl e_leq a b + with Not_found -> + (* a <= 0 && 0 <= (x << y) ==> a <= (x << y) *) + smp_leq_improved f_lsl a b let smp_eq_with_lsr a0 b0 = try @@ -780,6 +845,7 @@ let smp_leq_with_lsr x y = let k = two_power_k p in e_leq x (e_div a (e_zint k)) with Not_found -> + try let a,p = match_fun f_lsr x |> match_positive_or_null_integer_arg2 in (* (a >> p) <= y with p >= 0 *) if y == e_zero then @@ -789,6 +855,10 @@ let smp_leq_with_lsr x y = (* p >= 0 ==> ( (a >> p) <= y <==> a/(2**p) <= y ) *) let k = two_power_k p in e_leq (e_div a (e_zint k)) y + with Not_found -> + (* x <= y && 0 <= (a&b) ==> x <= (a >> b) *) + smp_leq_improved f_lsr x y + (* Rewritting at export *) let bitk_export k e = F.e_fun ~result:Logic.Bool f_bit_export [e;k] @@ -818,10 +888,10 @@ let () = no creation of [e_fun f_bit_stdlib args] *) let bi_lbit_stdlib = mk_builtin "f_bit_stdlib" f_bit_stdlib smp_mk_bit_stdlib in let bi_lbit = mk_builtin "f_bit" f_bit_positive smp_bitk_positive in - let bi_lnot = mk_builtin "f_lnot" f_lnot ~eq:smp_eq_with_lnot smp_lnot in - let bi_lxor = mk_builtin "f_lxor" f_lxor ~eq:smp_eq_with_lxor + let bi_lnot = mk_builtin "f_lnot" f_lnot ~eq:smp_eq_with_lnot smp_lnot ~leq:(smp_leq_improved f_lnot) in + let bi_lxor = mk_builtin "f_lxor" f_lxor ~eq:smp_eq_with_lxor ~leq:(smp_leq_improved f_lxor) (smp2 f_lxor Integer.logxor) in - let bi_lor = mk_builtin "f_lor" f_lor ~eq:smp_eq_with_lor + let bi_lor = mk_builtin "f_lor" f_lor ~eq:smp_eq_with_lor ~leq:(smp_leq_improved f_lor) (smp2 f_lor Integer.logor) in let bi_land = mk_builtin "f_land" f_land ~eq:smp_eq_with_land ~leq:smp_leq_with_land smp_land in diff --git a/src/plugins/wp/Cint.mli b/src/plugins/wp/Cint.mli index b4868c855f417c28f2984ccc3c879795ef2540d1..72a7467a5a38115973b22c0770461db1f062f5e2 100644 --- a/src/plugins/wp/Cint.mli +++ b/src/plugins/wp/Cint.mli @@ -77,6 +77,11 @@ val f_bits : lfun list (** All bit-test functions *) val bit_test : term -> int -> term +(** Matchers *) + +val match_power2 : term -> term +val match_power2_minus1 : term -> term + (** Simplifiers *) val is_cint_simplifier: simplifier @@ -85,4 +90,5 @@ val is_cint_simplifier: simplifier val mask_simplifier: simplifier +(* under approximation: [is_positive_or_null e] ==> [e] >= 0 *) val is_positive_or_null: term -> bool diff --git a/src/plugins/wp/Cmath.ml b/src/plugins/wp/Cmath.ml index bb51d8d1d63c55ec236320720d4bad3babdc0ad9..d286e62658799691ff7b7ecdb7613a051807a7d6 100644 --- a/src/plugins/wp/Cmath.ml +++ b/src/plugins/wp/Cmath.ml @@ -30,7 +30,7 @@ let f_builtin ~library ?(injective=false) ?(result=Real) ?(params=[Real]) ?ext n let call = match ext with Some call -> call | None -> String.sub name 1 (String.length name - 1) in - let link = Lang.infoprover (Engine.F_call call) in + let link = Engine.F_call call in let category = let open Qed.Logic in if injective then Injection else Function @@ -180,21 +180,12 @@ let builtin_strict_leq lfun ~domain ~zero ~monotonic a b = (* -------------------------------------------------------------------------- *) let f_iabs = - extern_f ~library:"cmath" - ~link:{ - altergo = Qed.Engine.F_call "abs_int"; - why3 = Qed.Engine.F_call "IAbs.abs"; - coq = Qed.Engine.F_call "Z.abs"; - } "\\iabs" + extern_f ~library:"cmath" ~link:(Qed.Engine.F_call "IAbs.abs") "\\iabs" let f_rabs = extern_f ~library:"cmath" ~result:Real ~params:[Sreal] - ~link:{ - altergo = Qed.Engine.F_call "abs_real"; - why3 = Qed.Engine.F_call "RAbs.abs"; - coq = Qed.Engine.F_call "R.abs"; - } "\\rabs" + ~link:(Qed.Engine.F_call "RAbs.abs") "\\rabs" let () = begin diff --git a/src/plugins/wp/CodeSemantics.ml b/src/plugins/wp/CodeSemantics.ml index 0d3faf7370690d6520fe523710e6f9436d8563f4..d058aa8f72c4dd97e2b4588f2befe35b916baa3e 100644 --- a/src/plugins/wp/CodeSemantics.ml +++ b/src/plugins/wp/CodeSemantics.ml @@ -229,7 +229,7 @@ struct | Ge -> Val (bool_of_comp env Cvalues.bool_leq M.loc_leq Cfloat.fle e2 e1) | LAnd -> Val (Cvalues.bool_and (bool_of_exp env e1) (bool_of_exp env e2)) | LOr -> Val (Cvalues.bool_or (bool_of_exp env e1) (bool_of_exp env e2)) - | PlusPI | IndexPI -> + | PlusPI -> let te = Cil.typeOf_pointed (Cil.typeOf e1) in let obj = Ctypes.object_of te in Loc(M.shift (loc_of_exp env e1) obj (val_of_exp env e2)) @@ -326,8 +326,6 @@ struct | UnOp(op,e,ty) -> exp_unop env ty op e | BinOp(op,e1,e2,tr) -> exp_binop env tr op e1 e2 - | Info(e,_) -> !s_exp env e - | AlignOfE _ | AlignOf _ | SizeOfE _ | SizeOf _ | SizeOfStr _ -> Val (Cvalues.constant_exp e) diff --git a/src/plugins/wp/Conditions.ml b/src/plugins/wp/Conditions.ml index 67ca47e2b299b191fe14931276ca22abae998743..fcf91379566be92395bd50fd1d57442c5f623cc3 100644 --- a/src/plugins/wp/Conditions.ml +++ b/src/plugins/wp/Conditions.ml @@ -447,7 +447,10 @@ let rec exist_intro p = let _,t = e_open ~pool ~exists:true ~forall:false ~lambda:false (e_prop p) in exist_intro (F.p_bool t) - | _ -> + | _ -> (* Note: Qed implement De Morgan rules + such that [p] cannot match the + decomposable representations: + Not Or, Not Imply, Not Forall *) if Wp_parameters.Prenex.get () then prenex_intro p else p @@ -463,7 +466,11 @@ let rec exist_intros = function let _,t = F.QED.e_open ~pool ~exists:true ~forall:false ~lambda:false (e_prop p) in exist_intros ((F.p_bool t)::hs) - | _ -> p::(exist_intros hs) + | _ -> (* Note: Qed implement De Morgan rules + such that [p] cannot match the + decomposable representations: + Not Or, Not Imply, Not Forall *) + p::(exist_intros hs) end (* -------------------------------------------------------------------------- *) @@ -488,8 +495,17 @@ let rec forall_intro p = (hp @ hs), (p::ps)) ([],[]) qs in (* ORs qs <==> ORs (hps ==> ps) <==> ((ANDs hps) ==> ORs ps) *) - hps, (p_disj ps) - | _ -> [] , p + let hps,ps = List.fold_left (fun (hs,ps) q -> + match F.repr (F.e_prop q) with + | Neq _ -> ((F.p_not q)::hs), ps + | _ -> hs, (q::ps)) (hps,[]) ps + in (* ORs qs <==> ((ANDs hps) ==> ORs ps)) *) + hps, (F.p_disj ps) + | _ -> (* Note: Qed implement De Morgan rules + such that [p] cannot match the + decomposable representations: + Not And, Not Exists *) + [] , p (* -------------------------------------------------------------------------- *) (* --- Constructors --- *) @@ -678,10 +694,8 @@ let rec flatten_sequence m = function (* --- Mapping --- *) (* -------------------------------------------------------------------------- *) -let lift f e = F.e_prop (f (F.p_bool e)) - let rec map_condition f = function - | State s -> State (Mstate.apply (lift f) s) + | State s -> State (Mstate.apply (F.p_lift f) s) | Have p -> Have (f p) | Type p -> Type (f p) | When p -> When (f p) diff --git a/src/plugins/wp/Conditions.mli b/src/plugins/wp/Conditions.mli index 0add484d766ed51ccb96f3f481d1da388951cda3..d16e68ae33be100dc76ac7e0c647b0a2cf8084e5 100644 --- a/src/plugins/wp/Conditions.mli +++ b/src/plugins/wp/Conditions.mli @@ -177,6 +177,8 @@ val lemma : pred -> sequent val head : step -> pred (** Predicate for Have and such, Condition for Branch, True for Either *) val have : step -> pred (** Predicate for Have and such, True for any other *) +val pred_cond : condition -> pred + val condition : sequence -> pred (** With free variables kept. *) val close : sequent -> pred (** With free variables {i quantified}. *) diff --git a/src/plugins/wp/Lang.ml b/src/plugins/wp/Lang.ml index 8dcfa782c14e65b50f3a291f06a15ed886a57950..a2f02f254515b8036e078a1966612b9bb8cc827b 100644 --- a/src/plugins/wp/Lang.ml +++ b/src/plugins/wp/Lang.ml @@ -104,27 +104,6 @@ let lemma_id l = Printf.sprintf "Q_%s" (avoid_leading_backlash l) (* -------------------------------------------------------------------------- *) -type 'a infoprover = - { - altergo: 'a; - why3 : 'a; - coq : 'a; - } - -(* generic way to have different informations for the provers *) - -let infoprover x = { - altergo = x; - why3 = x; - coq = x; -} - -let map_infoprover f i = { - altergo = f i.altergo; - why3 = f i.why3; - coq = f i.coq; -} - type library = string type datakind = KValue | KInit @@ -137,7 +116,7 @@ type adt = and mdt = string extern (** name to print to the provers *) and 'a extern = { ext_id : int; - ext_link : 'a infoprover; + ext_link : 'a ; ext_library : library; (** a library which it depends on *) ext_debug : string; (** just for printing during debugging *) } @@ -259,8 +238,8 @@ struct type t = adt let basename = function - | Mtype a -> basename "M" a.ext_link.altergo - | Mrecord(r,_) -> basename "R" r.ext_link.altergo + | Mtype a -> basename "M" a.ext_link + | Mrecord(r,_) -> basename "R" r.ext_link | Comp (c,KValue) -> basename (if c.cstruct then "S" else "U") c.corig_name | Comp (c,KInit) -> basename (if c.cstruct then "IS" else "IU") c.corig_name | Atype lt -> basename "A" lt.lt_name @@ -327,11 +306,11 @@ let is_builtin_type ~name = function | _ -> false let datatype ~library name = - let m = new_extern ~link:(infoprover name) ~library ~debug:name in + let m = new_extern ~link:name ~library ~debug:name in Mtype m let record ~link ~library fts = - let m = new_extern ~link ~library ~debug:link.altergo in + let m = new_extern ~link ~library ~debug:link in let r = { fields = [] } in let fs = List.map (fun (f,t) -> Mfield(m,r,f,t)) fts in r.fields <- fs ; Mrecord(m,r) @@ -491,7 +470,7 @@ let symbolf | Right -> Engine.F_right n in let link = match link with - | None -> infoprover (conv name balance) + | None -> conv name balance | Some info -> info in Extern (new_extern ~library:th ~link ~debug:name) in @@ -523,11 +502,11 @@ let extern_f let extern_p ~library ?bool ?prop ?link ?(params=[]) ?(coloring=false) () = let link = match bool,prop,link with - | Some b , Some p , None -> infoprover (Engine.F_bool_prop(b,p)) + | Some b , Some p , None -> Engine.F_bool_prop(b,p) | _ , _ , Some info -> info | _ , _ , _ -> assert false in - let debug = Export.debug link.altergo in + let debug = Export.debug link in Model { m_category = Logic.Function; m_params = params ; @@ -539,8 +518,8 @@ let extern_p ~library ?bool ?prop ?link ?(params=[]) ?(coloring=false) () = let extern_fp ~library ?(params=[]) ?link ?(coloring=false) phi = let link = match link with - | None -> infoprover (Engine.F_call phi) - | Some link -> map_infoprover (fun phi -> Engine.F_call(phi)) link in + | None -> Engine.F_call phi + | Some link -> Engine.F_call link in Model { m_category = Logic.Function ; m_params = params ; @@ -642,7 +621,6 @@ let parameters phi = Fun.parameters := phi class virtual idprinting = object(self) - method virtual infoprover: 'a. 'a infoprover -> 'a method virtual sanitize : string -> string method sanitize_type = self#sanitize @@ -650,8 +628,8 @@ class virtual idprinting = method sanitize_fun = self#sanitize method datatype = function - | Mtype a -> self#infoprover a.ext_link - | Mrecord(a,_) -> self#infoprover a.ext_link + | Mtype a -> a.ext_link + | Mrecord(a,_) -> a.ext_link | Comp(c, KValue) -> self#sanitize_type (comp_id c) | Comp(c, KInit) -> self#sanitize_type (comp_init_id c) | Atype lt -> self#sanitize_type (type_id lt) @@ -663,7 +641,7 @@ class virtual idprinting = | ACSL f -> Engine.F_call (self#sanitize_fun (logic_id f)) | CTOR c -> Engine.F_call (self#sanitize_fun (ctor_id c)) | Model({m_source=Generated(_,n)}) -> Engine.F_call (self#sanitize_fun n) - | Model({m_source=Extern e}) -> self#infoprover e.ext_link + | Model({m_source=Extern e}) -> e.ext_link end let name_of_lfun = function @@ -783,7 +761,8 @@ struct let e_prop t = t let p_bools xs = xs let e_props xs = xs - let lift f x = f x + let e_lift f = f + let p_lift f = f let is_zero e = match QED.repr e with | Kint z -> Integer.equal z Integer.zero diff --git a/src/plugins/wp/Lang.mli b/src/plugins/wp/Lang.mli index b78d557b1d0e4be9f3d1fef10f87b63a1b7aee24..514110749b1f0336eb4f14377b20cd5e78ea32ec 100644 --- a/src/plugins/wp/Lang.mli +++ b/src/plugins/wp/Lang.mli @@ -31,19 +31,6 @@ open Qed.Logic type library = string -(** Name for external prover. - - In case a Qed.Engine.link is used, [F_subst] patterns - are not supported for Why-3. *) -type 'a infoprover = { - altergo: 'a; - why3 : 'a; - coq : 'a; -} -(** generic way to have different informations for the provers *) - -val infoprover: 'a -> 'a infoprover -(** same information for all the provers *) (** {2 Naming} Unique identifiers. *) val comp_id : compinfo -> string @@ -67,7 +54,7 @@ type adt = private (** A type is never registered in a Definition.t *) and mdt = string extern (** name to print to the provers *) and 'a extern = { ext_id : int; - ext_link : 'a infoprover; + ext_link : 'a ; ext_library : library; (** a library which it depends on *) ext_debug : string; (** just for printing during debugging *) } @@ -105,7 +92,7 @@ val is_builtin_type : name:string -> tau -> bool val get_builtin_type : name:string -> adt val datatype : library:string -> string -> adt val record : - link:string infoprover -> library:string -> (string * tau) list -> adt + link:string -> library:string -> (string * tau) list -> adt val comp : compinfo -> adt val comp_init : compinfo -> adt val field : adt -> string -> field @@ -119,7 +106,7 @@ type balance = Nary | Left | Right val extern_s : library:library -> - ?link:(Engine.link infoprover) -> + ?link:Engine.link -> ?category:lfun category -> ?params:sort list -> ?sort:sort -> @@ -130,7 +117,7 @@ val extern_s : val extern_f : library:library -> - ?link:(Engine.link infoprover) -> + ?link:Engine.link -> ?balance:balance -> ?category:lfun category -> ?params:sort list -> @@ -145,13 +132,13 @@ val extern_p : library:library -> ?bool:string -> ?prop:string -> - ?link:Engine.link infoprover -> + ?link:Engine.link -> ?params:sort list -> ?coloring:bool -> unit -> lfun val extern_fp : library:library -> ?params:sort list -> - ?link:string infoprover -> ?coloring:bool -> string -> lfun + ?link:string -> ?coloring:bool -> string -> lfun val generated_f : ?context:bool -> ?category:lfun category -> ?params:sort list -> ?sort:sort -> ?result:tau -> ?coloring:bool -> @@ -160,7 +147,7 @@ val generated_f : ?context:bool -> ?category:lfun category -> val generated_p : ?context:bool -> ?coloring:bool -> string -> lfun val extern_t: - string -> link:string infoprover -> library:library -> mdt + string -> link:string -> library:library -> mdt (** {2 Sorting and Typing} *) @@ -209,9 +196,6 @@ class virtual idprinting : object method virtual sanitize : string -> string - method virtual infoprover : 'a. 'a infoprover -> 'a - (** Specify the field to use in an infoprover *) - method sanitize_type : string -> string (** Defaults to [self#sanitize] *) @@ -356,7 +340,8 @@ sig val e_prop : pred -> term val p_bools : term list -> pred list val e_props : pred list -> term list - val lift : (term -> term) -> pred -> pred + val e_lift : (term -> term) -> pred -> pred + val p_lift : (pred -> pred) -> term -> term val p_not : pred -> pred val p_and : pred -> pred -> pred diff --git a/src/plugins/wp/LogicBuiltins.ml b/src/plugins/wp/LogicBuiltins.ml index 5808c304bcfa208cdfd8a5cb7d34bf2f999b9536..04077deac7bbe2232c8eb55c771e16d1e12f6826 100644 --- a/src/plugins/wp/LogicBuiltins.ml +++ b/src/plugins/wp/LogicBuiltins.ml @@ -239,7 +239,7 @@ let add_logic ~source result name kinds ~library ?category ~link () = let add_predicate ~source name kinds ~library ~link () = let params = List.map skind kinds in - let lfun = Lang.extern_fp ~library ~params ~link link.altergo in + let lfun = Lang.extern_fp ~library ~params ~link link in register ~source name kinds (LFUN lfun) let add_ctor ~source name kinds ~library ~link () = @@ -248,7 +248,7 @@ let add_ctor ~source name kinds ~library ~link () = let lfun = Lang.extern_s ~library ~category ~params ~link name in register ~source name kinds (LFUN lfun) -let add_type ?source name ~library ?(link=Lang.infoprover name) () = +let add_type ?source name ~library ?(link=name) () = let mdt = Lang.extern_t name ~link ~library in register_type ?source name (E_mdt mdt) diff --git a/src/plugins/wp/LogicBuiltins.mli b/src/plugins/wp/LogicBuiltins.mli index 2ae96f291fc9cf31a4a5700ed3d4dc41a3be472b..7d4f5dc99001b2203c78a32b96a16508aea070b6 100644 --- a/src/plugins/wp/LogicBuiltins.mli +++ b/src/plugins/wp/LogicBuiltins.mli @@ -78,17 +78,17 @@ val add_library : string -> string list -> unit val add_alias : source:Filepath.position -> string -> kind list -> alias:string -> unit -> unit val add_type : ?source:Filepath.position -> string -> library:string -> - ?link:string infoprover -> unit -> unit + ?link:string -> unit -> unit val add_ctor : source:Filepath.position -> string -> kind list -> - library:string -> link:Qed.Engine.link infoprover -> unit -> unit + library:string -> link:Qed.Engine.link -> unit -> unit val add_logic : source:Filepath.position -> kind -> string -> kind list -> - library:string -> ?category:category -> link:Qed.Engine.link infoprover -> + library:string -> ?category:category -> link:Qed.Engine.link -> unit -> unit val add_predicate : source:Filepath.position -> string -> kind list -> - library:string -> link:string infoprover -> + library:string -> link:string -> unit -> unit val add_option : diff --git a/src/plugins/wp/LogicSemantics.ml b/src/plugins/wp/LogicSemantics.ml index 654ecfa161c9ec36f57379ff101be547cecbecc1..f9ce31602dd9316b5099a6b4195c33053d7f4340 100644 --- a/src/plugins/wp/LogicSemantics.ml +++ b/src/plugins/wp/LogicSemantics.ml @@ -417,7 +417,7 @@ struct | Mult -> arith env (L.apply e_mul) (L.apply F.e_mul) a b | Div -> arith env (L.apply e_div) (L.apply F.e_div) a b | Mod -> L.apply e_mod (C.logic env a) (C.logic env b) - | PlusPI | IndexPI -> + | PlusPI -> let va = C.logic env a in let vb = C.logic env b in let te = Logic_typing.ctype_of_pointed a.term_type in @@ -807,6 +807,23 @@ struct let addrs = C.logic env t in p_all (L.initialized sigma) (L.region (Ctypes.object_of te) addrs) + let call_pred env f ls es = + match C.logic_info env f with + | Some p -> + if ls <> [] || es <> [] then + Warning.error "Unexpected parameters for named predicate '%a'" + Logic_info.pretty f ; p + | None -> + let empty ls = + if ls <> [] then + Warning.error "Unexpected labels for purely logic '%a'" + Logic_info.pretty f ; + in + match LogicBuiltins.logic f with + | ACSLDEF -> C.call_pred env f ls es + | HACK phi -> empty ls ; F.p_bool (phi es) + | LFUN p -> empty ls ; p_call p es + let predicate polarity env p = match p.pred_content with | Pfalse -> p_false @@ -833,24 +850,7 @@ struct | _ -> Warning.error "\\subset requires 2 arguments" end | Papp(f,ls,ts) -> - begin - match C.logic_info env f with - | Some p -> - if ls <> [] || ts <> [] then - Warning.error "Unexpected parameters for named predicate '%a'" - Logic_info.pretty f ; p - | None -> - let empty ls = - if ls <> [] then - Warning.error "Unexpected labels for purely logic '%a'" - Logic_info.pretty f ; - in - let es = List.map (val_of_term env) ts in - match LogicBuiltins.logic f with - | ACSLDEF -> C.call_pred env f ls es - | HACK phi -> empty ls ; F.p_bool (phi es) - | LFUN p -> empty ls ; p_call p es - end + call_pred env f ls @@ List.map (val_of_term env) ts | Plet( { l_var_info=v ; l_body=LBterm a } , p ) -> let va = C.logic env a in diff --git a/src/plugins/wp/Makefile.in b/src/plugins/wp/Makefile.in index 72ad09daf3b043ff114ba3ab2f89fdfc1681c145..e0d4f620803ca394f56cbd1ba015bd08e7418946 100644 --- a/src/plugins/wp/Makefile.in +++ b/src/plugins/wp/Makefile.in @@ -34,7 +34,7 @@ ifneq ("$(FRAMAC_INTERNAL)","yes") include $(FRAMAC_SHARE)/Makefile.config endif -# Coq Resources Installation +# Resources Installation include $(PLUGIN_DIR)/share/Makefile.resources # Extension of the GUI for wp is compilable @@ -84,17 +84,17 @@ PLUGIN_CMO:= \ MemMemory MemTyped MemRegion MemVal \ wpReached wpRTE wpTarget \ CfgCompiler StmtSemantics \ - VCS script proof wpo wpReport \ + VCS script wpo wpReport \ Footprint Tactical Strategy \ TacClear TacSplit TacChoice TacRange TacInduction \ TacArray TacCompound TacUnfold \ TacHavoc TacInstance TacLemma \ TacFilter TacCut WpTac TacNormalForm \ - TacRewrite TacBitwised TacBitrange TacBittest TacShift \ + TacRewrite TacBitwised TacBitrange TacBittest TacModMask TacShift \ TacSequence \ TacCongruence TacOverflow Auto \ ProofSession ProofScript ProofEngine \ - ProverTask ProverErgo ProverCoq \ + ProverTask \ filter_axioms Cache ProverWhy3 \ driver prover ProverSearch ProverScript \ Factory \ @@ -158,7 +158,6 @@ endif WP_CONFIGURE_MAKEFILE= \ $(Wp_DIR)/Makefile.in \ - $(Wp_DIR)/share/Makefile.coqwp \ $(Wp_DIR)/share/Makefile.resources \ $(CONFIG_STATUS_DIR)/config.status @@ -303,15 +302,10 @@ clean:: ## All relative to share/ -ALL_COQ_SOURCES= $(addprefix coqwp/, $(COQ_LIBS_CEA) $(COQ_LIBS_INRIA)) -ALL_COQ_BINARIES= $(addsuffix o, $(ALL_COQ_SOURCES)) -ALL_ERGO_SOURCES= $(addprefix ergo/, $(ERGO_LIBS_CEA) $(ERGO_LIBS_INRIA)) ALL_WHY3_SOURCES= $(addprefix why3/frama_c_wp/, $(WHY3_LIBS_CEA)) ALL_RESOURCES= \ wp.driver \ - $(ALL_COQ_SOURCES) \ - $(ALL_ERGO_SOURCES) \ $(ALL_WHY3_SOURCES) INSTALL_OPT?= @@ -326,22 +320,6 @@ clean:: $(Wp_DIR)/share/instwp: $(Wp_DIR)/share/install.ml $(OCAMLC) $(WARNINGS) -w -70 -o $@ unix.cma $^ -# -------------------------------------------------------------------------- -# --- Pre-Compiled Coq Libraries --- -# -------------------------------------------------------------------------- - -WP_COQC_ENABLED=@COQC@ - -ifeq ($(WP_COQC_ENABLED),yes) - -include $(Wp_DIR)/share/Makefile.coqwp - -byte:: coqwpcompile -opt:: coqwpcompile -clean:: wp-coq-clean - -endif #($(WP_COQC_ENABLED),yes) - # -------------------------------------------------------------------------- # --- Installation --- # -------------------------------------------------------------------------- @@ -352,7 +330,7 @@ install:: clean-install $(INSTALL_SHARE) -p \ -i $(Wp_DIR)/share \ -d $(FRAMAC_DATADIR)/wp \ - $(ALL_RESOURCES) -f -b $(ALL_COQ_BINARIES) + $(ALL_RESOURCES) -f -b uninstall:: $(PRINT_RM) WP shared files diff --git a/src/plugins/wp/MemMemory.ml b/src/plugins/wp/MemMemory.ml index 2a1f2ec14ab720ecd36bbcfad79c12668358e1c1..7c4439368ec666ff44f8782f3c23ba1709fccd26 100644 --- a/src/plugins/wp/MemMemory.ml +++ b/src/plugins/wp/MemMemory.ml @@ -34,15 +34,9 @@ let library = "memory" let a_addr = Lang.datatype ~library "addr" let t_addr = L.Data(a_addr,[]) let f_base = Lang.extern_f ~library ~result:L.Int - ~link:{altergo = Qed.Engine.F_subst("%1.base"); - why3 = Qed.Engine.F_call "base"; - coq = Qed.Engine.F_subst("(base %1)"); - } "base" + ~link:(Qed.Engine.F_subst ("base", "%1.base")) "base" let f_offset = Lang.extern_f ~library ~result:L.Int - ~link:{altergo = Qed.Engine.F_subst("%1.offset"); - why3 = Qed.Engine.F_call "offset"; - coq = Qed.Engine.F_subst("(offset %1)"); - } "offset" + ~link:(Qed.Engine.F_subst ("offset", "%1.offset")) "offset" let f_shift = Lang.extern_f ~library ~result:t_addr "shift" let f_global = Lang.extern_f ~library ~result:t_addr ~category:L.Injection "global" let f_null = Lang.extern_f ~library ~result:t_addr "null" @@ -60,17 +54,8 @@ let ty_fst_arg = function | Some l :: _ -> l | _ -> raise Not_found -let l_havoc = Qed.Engine.{ - coq = F_call "fhavoc" ; - altergo = F_call "havoc" ; - why3 = F_call "havoc" ; - } - -let l_set_init = Qed.Engine.{ - coq = F_call "fset_init" ; - altergo = F_call "set_init" ; - why3 = F_call "set_init" ; - } +let l_havoc = Qed.Engine.F_call "havoc" +let l_set_init = Qed.Engine.F_call "set_init" let p_valid_rd = Lang.extern_fp ~library "valid_rd" let p_valid_rw = Lang.extern_fp ~library "valid_rw" diff --git a/src/plugins/wp/MemVal.ml b/src/plugins/wp/MemVal.ml index 41fe7034755482a024ad6f5e08373a439a18058f..f9ce1bc2aee6234cf669662def2482faee5ce75a 100644 --- a/src/plugins/wp/MemVal.ml +++ b/src/plugins/wp/MemVal.ml @@ -93,15 +93,9 @@ let library = "memory" let a_addr = Lang.datatype ~library "addr" let t_addr = Logic.Data(a_addr,[]) let f_base = Lang.extern_f ~library ~result:Logic.Int - ~link:{altergo = Qed.Engine.F_subst("%1.base"); - why3 = Qed.Engine.F_subst("%1.base"); - coq = Qed.Engine.F_subst("(base %1)"); - } "base" + ~link:(Qed.Engine.F_subst ("base", "%1.base")) "base" let f_offset = Lang.extern_f ~library ~result:Logic.Int - ~link:{altergo = Qed.Engine.F_subst("%1.offset"); - why3 = Qed.Engine.F_subst("%1.offset"); - coq = Qed.Engine.F_subst("(offset %1)"); - } "offset" + ~link:(Qed.Engine.F_subst ("offset", "%1.offset")) "offset" let f_shift = Lang.extern_f ~library ~result:t_addr "shift" let f_global = Lang.extern_f ~library ~result:t_addr "global" let f_null = Lang.extern_f ~library ~result:t_addr "null" diff --git a/src/plugins/wp/Plang.ml b/src/plugins/wp/Plang.ml index 57124006229ee4da71d2282c2da6646e4b8490d7..d7db964ede9e406c71deaafb7a2f7d4a7c6a63be 100644 --- a/src/plugins/wp/Plang.ml +++ b/src/plugins/wp/Plang.ml @@ -75,7 +75,6 @@ class engine = object(self) inherit E.engine as super inherit Lang.idprinting - method infoprover w = w.altergo (* --- Types --- *) diff --git a/src/plugins/wp/Plang.mli b/src/plugins/wp/Plang.mli index 8bb4335527bf1fa85615332b80082d2c81605a96..852594b6362e40a55a69c25cbf03e0b3c982063d 100644 --- a/src/plugins/wp/Plang.mli +++ b/src/plugins/wp/Plang.mli @@ -52,7 +52,6 @@ class engine : (**/**) inherit Lang.idprinting method sanitize : string -> string - method infoprover : 'a. 'a Lang.infoprover -> 'a method op_spaced : string -> bool (**/**) end diff --git a/src/plugins/wp/ProofEngine.ml b/src/plugins/wp/ProofEngine.ml index fc339fef85eb6063ff2ff29b293bf6c508d764e4..ff5c98207f25eded765ef2ff506a99a991af50cd 100644 --- a/src/plugins/wp/ProofEngine.ml +++ b/src/plugins/wp/ProofEngine.ml @@ -307,7 +307,6 @@ let mk_goal t ~title ~part ~axioms sequent = let sid = Printf.sprintf "%s-%d" t.main.Wpo.po_sid id in Wpo.({ po_gid = gid ; - po_leg = "" ; (* no use for legacy name *) po_sid = sid ; po_name = Printf.sprintf "%s (%s)" title part ; po_idx = t.main.po_idx ; diff --git a/src/plugins/wp/ProofScript.ml b/src/plugins/wp/ProofScript.ml index 3e0bcc83cc2e0545b379335b14211c9397578161..531175ba1eec83466e6fb7d5df905a926b41a4af 100644 --- a/src/plugins/wp/ProofScript.ml +++ b/src/plugins/wp/ProofScript.ml @@ -97,6 +97,7 @@ let j_step = j_select "clause-step" let j_ingoal = j_select "inside-goal" let j_instep = j_select "inside-step" let j_compose = j_select "compose" +let j_multi = j_select "multi" let j_kint = j_select "kint" let j_range = j_select "range" let j_id a = "id" , `String a @@ -136,6 +137,9 @@ let rec json_of_selection = function `Assoc [ j_instep ; j_at s ; j_kind s ; j_occur n ; j_term e ; j_pattern m ] + | Multi es -> + `Assoc (j_multi :: j_args es) + and j_args = function | [] -> [] | es -> ["args" , `List (List.map json_of_selection es)] @@ -184,6 +188,9 @@ let rec selection_of_json ((hs,g) as s : sequent) js = let id = j_id js in let args = j_args js in Tactical.compose id (List.map (selection_of_json s) args) + | "multi" -> + let args = j_args js in + Tactical.multi @@ List.map (selection_of_json s) args | "kint" -> Tactical.cint (j_val js) | "range" -> Tactical.range (j_min js) (j_max js) | _ -> raise Not_found diff --git a/src/plugins/wp/ProofSession.ml b/src/plugins/wp/ProofSession.ml index 106f45f28e311adb88b4b21e701426c6a8a56aac..c1c8af78ef229da15cb6dc6b87d70545410cfc0c 100644 --- a/src/plugins/wp/ProofSession.ml +++ b/src/plugins/wp/ProofSession.ml @@ -43,7 +43,6 @@ let legacies wpo = [ jsonfile dscript wpo.po_gid ; jsonfile dmodel wpo.po_gid ; - jsonfile dmodel wpo.po_leg ; ] let get wpo = @@ -62,12 +61,11 @@ let get wpo = let pp_file fmt s = Filepath.Normalized.(pretty fmt (of_string s)) -let pp_script fmt = function - | NoScript -> Format.pp_print_string fmt "no script file" +let pp_script_for fmt wpo = + match get wpo with | Script f -> Format.fprintf fmt "script '%a'" pp_file f - | Deprecated f -> Format.fprintf fmt "script '%a' (deprecated)" pp_file f - -let pp_script_for fmt wpo = pp_script fmt (get wpo) + | Deprecated f -> Format.fprintf fmt "(deprecated) script '%a'" pp_file f + | _ -> Format.fprintf fmt "script '%a'" pp_file @@ filename ~force:false wpo let exists wpo = match get wpo with NoScript -> false | Script _ | Deprecated _ -> true diff --git a/src/plugins/wp/ProofSession.mli b/src/plugins/wp/ProofSession.mli index 86372425758114ec4fbe5d1c68a7d2f44162418c..58d2badb9a9b1f0dffff75431815077363d5cd21 100644 --- a/src/plugins/wp/ProofSession.mli +++ b/src/plugins/wp/ProofSession.mli @@ -25,7 +25,6 @@ type script = | Script of string | Deprecated of string -val pp_script : Format.formatter -> script -> unit val pp_script_for : Format.formatter -> Wpo.t -> unit val get : Wpo.t -> script diff --git a/src/plugins/wp/ProverCoq.ml b/src/plugins/wp/ProverCoq.ml deleted file mode 100644 index 5519ecdb25631a162ea97fb39b55eabb7707b810..0000000000000000000000000000000000000000 --- a/src/plugins/wp/ProverCoq.ml +++ /dev/null @@ -1,674 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Prover Coq Interface --- *) -(* -------------------------------------------------------------------------- *) - -open Cil_types -open Qed -open Lang -open Definitions - -let dkey = Wp_parameters.register_category "prover" - -let cluster_file c = - let dir = WpContext.directory () in - let base = cluster_id c in - Printf.sprintf "%s/%s.v" (dir :> string) base - -(* -------------------------------------------------------------------------- *) -(* --- External Coq Libraries --- *) -(* -------------------------------------------------------------------------- *) - -(* Applies to both WP resources from the Share, and User-defined libraries *) -let option_file = LogicBuiltins.create_option - (fun ~driver_dir x -> driver_dir ^ "/" ^ x) - "coq" "file" - -type coqlib = { - c_id : string ; (* Identifies the very original file. *) - c_source : string ; (* Original file directory. *) - c_file : string ; (* Relative Coq source file. *) - c_path : string ; (* Relative Coq source directory. *) - c_name : string ; (* Module package. *) - c_module : string ; (* Full module name. *) -} - -(* example: - - { - c_id="/mydir/foobar:a/b/User.v" ; - c_source="/mydir/foobar" ; - c_file= "a/b/User.v" ; - c_path = "a/b" ; - c_name = "a.b" ; - c_module = "a.b.User" ; - } - -*) - -(* Take the directory name and changes all '/' into '.' *) -let name_of_path path = - if path = "." then "" - else - String.map (fun c -> if c = '/' || c = '\\' then '.' else c) path - -let find_nonwin_column opt = - let p = String.rindex opt ':' in - if String.length opt >= 3 && - opt.[1] = ':' && (opt.[2] = '/' || opt.[2] = '\\') && p = 1 then - (* windows absolute path, not <source>:<dir>/<file.v> format. *) - raise Not_found - else p - -(* Parses the coq.file option from the driver. *) -let parse_c_option opt = - try - (* Format "<source>:<dir>/<file.v>" *) - let p = find_nonwin_column opt in - let c_source = String.sub opt 0 p in - let c_file = String.sub opt (p+1) (String.length opt - p - 1) in - let c_path = Filename.dirname c_file in - let c_name = name_of_path c_path in - let coqid = Filename.chop_extension (Filename.basename c_file) in - let c_module = - Printf.sprintf "%s.%s" c_name - (String.capitalize_ascii coqid) - in - { c_id = opt ; c_source ; c_file ; c_path ; c_name ; c_module } - with Not_found -> - (* Format "<source>/<file.v>" *) - let c_source = Filename.dirname opt in - let c_file = Filename.basename opt in - let c_module = - String.capitalize_ascii (Filename.chop_extension c_file) - in - { c_id = opt ; c_source ; c_file ; c_path = "." ; c_name = "" ; c_module } - -let coqlibs = Hashtbl.create 128 (*[LC] Not Projectified. *) -let c_option opt = - try Hashtbl.find coqlibs opt - with Not_found -> - let clib = parse_c_option opt in - Hashtbl.add coqlibs opt clib ; clib -(* -------------------------------------------------------------------------- *) -(* --- Dependencies --- *) -(* -------------------------------------------------------------------------- *) - -type depend = - | D_cluster of cluster (* Generated in <out>/<model>/A.v *) - | D_coqlib of coqlib (* From <source>/ or <out>/coqwp/ *) - -(* -------------------------------------------------------------------------- *) -(* --- Exporting Formulae to Coq --- *) -(* -------------------------------------------------------------------------- *) - -let engine = - let module E = Qed.Export_coq.Make(Lang.F.QED) in - object(self) - inherit E.engine as super - inherit Lang.idprinting - method infoprover p = p.coq - - method! pp_fun cmode fct ts = - if fct == Vlist.f_concat - then Vlist.export self ts - else super#pp_fun cmode fct ts - - end - - -class visitor fmt c = - object(self) - - inherit Definitions.visitor c - inherit ProverTask.printer fmt (cluster_title c) - - val mutable deps : depend list = [] - - (* --- Managing Formatter --- *) - - method flush = - begin - Format.pp_print_newline fmt () ; - List.rev deps - end - - (* --- Files, Theories and Clusters --- *) - - method add_coqfile opt = - let clib = c_option opt in - Format.fprintf fmt "Require Import %s.@\n" clib.c_module ; - deps <- (D_coqlib clib) :: deps - - method on_library thy = - let files = LogicBuiltins.get_option option_file ~library:thy in - List.iter self#add_coqfile files - - method on_cluster c = - self#lines ; - Format.fprintf fmt "Require Import %s.@\n" (cluster_id c) ; - deps <- (D_cluster c) :: deps - - method on_type lt def = - begin - self#lines ; - engine#declare_type fmt (Lang.adt lt) (List.length lt.lt_params) def ; - end - - method private gen_on_comp kind c fts = - begin - self#paragraph ; - let adt = match kind with - | KValue -> Lang.comp c - | KInit -> Lang.comp_init c - in - let t = match fts with - | None -> Qed.Engine.Tabs - | Some fts -> Qed.Engine.Trec fts - in - engine#declare_type fmt adt 0 t ; - end - - method on_comp = self#gen_on_comp KValue - method on_icomp = self#gen_on_comp KInit - - method on_dlemma l = - begin - self#paragraph ; - engine#declare_axiom fmt - (Lang.lemma_id l.l_name) - l.l_forall l.l_triggers - (F.e_prop l.l_lemma) - end - - method on_dfun d = - begin - self#paragraph ; - match d.d_definition with - | Logic t -> - engine#declare_signature fmt - d.d_lfun (List.map F.tau_of_var d.d_params) t ; - | Function(t,mu,v) -> - let pp = match mu with - | Rec -> engine#declare_fixpoint ~prefix:"Fix" - | Def -> engine#declare_definition - in pp fmt d.d_lfun d.d_params t v - | Predicate(mu,p) -> - let pp = match mu with - | Rec -> engine#declare_fixpoint ~prefix:"Fix" - | Def -> engine#declare_definition - in pp fmt d.d_lfun d.d_params Logic.Prop (F.e_prop p) - | Inductive dl -> - engine#declare_inductive fmt - d.d_lfun (List.map F.tau_of_var d.d_params) Logic.Prop - (List.map (fun l -> (Lang.lemma_id l.l_name, - l.l_forall, - l.l_triggers, - (F.e_prop l.l_lemma)) - ) dl) - end - - end - -let write_cluster c = - let f = cluster_file c in - Wp_parameters.debug ~dkey "Generate '%s'" f ; - let deps = Command.print_file f - begin fun fmt -> - let v = new visitor fmt c in - v#lines ; - v#printf "Require Import ZArith.@\n" ; - v#printf "Require Import Reals.@\n" ; - v#on_library "qed" ; - v#vself ; - v#flush ; - end - in Wp_parameters.print_generated f ; deps - -(* -------------------------------------------------------------------------- *) -(* --- Assembling Goal --- *) -(* -------------------------------------------------------------------------- *) - -(* Returns whether source was modified after target *) -let need_recompile ~source ~target = - try - let t_src = (Unix.stat source).Unix.st_mtime in - let t_tgt = (Unix.stat target).Unix.st_mtime in - t_src >= t_tgt - with Unix.Unix_error _ -> true - -(* Used to mark version of clusters already available *) - -module CLUSTERS = WpContext.Index - (struct - type key = cluster - type data = int * depend list - let name = "ProverCoq.FILES" - let compare = cluster_compare - let pretty = pp_cluster - end) - -(* Used to mark coqlib versions to use *) -module Marked = Set.Make - (struct - type t = depend - let compare d1 d2 = - match d1 , d2 with - | D_coqlib _ , D_cluster _ -> (-1) - | D_cluster _ , D_coqlib _ -> 1 - | D_cluster c1 , D_cluster c2 -> Definitions.cluster_compare c1 c2 - | D_coqlib c1 , D_coqlib c2 -> String.compare c1.c_id c2.c_id - end) - -type included = string * string -(* -R <path> <name>, name possibly empty, use -I instead *) -type coqcc = { - mutable marked : Marked.t ; - mutable includes : included list ; (* (reversed) includes with as *) - mutable sources : string list ; (* (reversed) file .v to recompile *) -} - -let add_include coqcc dir = - if not (List.mem dir coqcc.includes) then coqcc.includes <- dir :: coqcc.includes - -let add_source coqcc file = - if not (List.mem file coqcc.sources) then coqcc.sources <- file :: coqcc.sources - -(* Recursive assembly: some file need further dependencies *) - -let rec assemble coqcc d = - if not (Marked.mem d coqcc.marked) then - begin - coqcc.marked <- Marked.add d coqcc.marked ; - match d with - | D_cluster cluster -> assemble_cluster coqcc cluster - | D_coqlib clib -> assemble_coqlib coqcc clib - end - -and assemble_cluster coqcc c = - let (age,deps) = try CLUSTERS.find c with Not_found -> (-1,[]) in - let deps = - if age < cluster_age c then - let deps = write_cluster c in - CLUSTERS.update c (cluster_age c , deps) ; deps - else deps in - List.iter (assemble coqcc) deps ; - add_source coqcc (cluster_file c) - -and assemble_coqlib coqcc c = - let compiled = Printf.sprintf "%s/%so" c.c_source c.c_file in - if Sys.file_exists compiled then - let dir = Printf.sprintf "%s/%s" c.c_source c.c_path in - add_include coqcc (dir,c.c_name) - else - begin - let tgtdir = Wp_parameters.get_output_dir "coqwp" in - let source = Printf.sprintf "%s/%s" c.c_source c.c_file in - let target = Printf.sprintf "%s/%s" (tgtdir :> string) c.c_file in - let dir = Printf.sprintf "%s/%s" (tgtdir :> string) c.c_path in - if need_recompile ~source ~target then - begin - Wp_parameters.make_output_dir dir ; - Command.copy source target ; - end ; - add_include coqcc (dir,c.c_name) ; - add_source coqcc target; - end - -(* -------------------------------------------------------------------------- *) -(* --- Assembling Goal --- *) -(* -------------------------------------------------------------------------- *) - -let assemble_goal ~pid axioms prop = - let title = Pretty_utils.to_string WpPropId.pretty pid in - let model = WpContext.directory () in - let id = WpPropId.get_propid pid in - let file = Printf.sprintf "%s/%s.coq" (model :> string) id in - let goal = cluster ~id ~title () in - let deps = Command.print_file file - begin fun fmt -> - let v = new visitor fmt goal in - v#printf "Require Import ZArith.@\n" ; - v#printf "Require Import Reals.@\n" ; - v#on_library "qed" ; - v#vgoal axioms prop ; - let libs = Wp_parameters.CoqLibs.get () in - if libs <> [] then - begin - v#section "Additional Libraries" ; - List.iter v#add_coqfile libs ; - v#hline ; - end ; - v#paragraph ; - engine#global - begin fun () -> - v#printf "@[<hv 2>Goal@ %a.@]@." - engine#pp_prop (F.e_prop prop) ; - end ; - v#flush - end in - let coqcc = { marked = Marked.empty ; includes = [] ; sources = [] } in - List.iter (assemble coqcc) deps ; - let includes = ((model :> string) , "") :: List.rev coqcc.includes in - let sources = List.rev coqcc.sources in - includes , sources , file - -(* -------------------------------------------------------------------------- *) -(* --- Running Coq --- *) -(* -------------------------------------------------------------------------- *) - -open Task -open VCS - -let coq_timeout () = - let coqtimeout = Wp_parameters.CoqTimeout.get () in - let gentimeout = Wp_parameters.Timeout.get () in - max coqtimeout gentimeout - -let coqide_lock = Task.mutex () -let emacs_regexp = Str.regexp_string_case_fold "emacs" -let is_emacs cmd = - try ignore (Str.search_forward emacs_regexp cmd 0) ; true - with Not_found -> false - -class runcoq includes source = - let base = Filename.chop_extension source in - let logout = base ^ "_Coq.out" in - let logerr = base ^ "_Coq.err" in - object(self) - - inherit ProverTask.command "coq" - - method private project = - let dir = Filename.dirname source in - let p = Wp_parameters.CoqProject.get () in - Command.pp_to_file (Printf.sprintf "%s/%s" dir p) - begin fun fmt -> - List.iter - (fun (dir,name) -> - if name = "" then - Format.fprintf fmt "-R %s ''@\n" dir - else - Format.fprintf fmt "-R %s %s@\n" dir name - ) includes ; - Format.fprintf fmt "-arg@\n" ; - end - - method private options = - begin - List.iter - (fun (dir,name) -> - if name = "" then - self#add ["-R";dir;""] - else - self#add ["-R";dir;name] - ) includes ; - end - - method failed : 'a. 'a task = - begin - let name = Filename.basename source in - Wp_parameters.feedback ~ontty:`Message "[Coq] '%s' compilation failed." name ; - if Wp_parameters.verbose_atleast 1 then - begin - ProverTask.pp_file ~message:"Coqc (stdout)" ~file:logout ; - ProverTask.pp_file ~message:"Coqc (stderr)" ~file:logerr ; - end ; - Task.failed "Compilation of '%s' failed." name ; - end - - method compile = - let cmd = Wp_parameters.CoqCompiler.get () in - self#set_command cmd ; - self#options ; - self#add [ source ] ; - self#timeout (coq_timeout ()) ; - Task.call - (fun () -> - let name = Filename.basename source in - Wp_parameters.feedback ~ontty:`Transient - "[Coq] Compiling '%s'." name) () - >>= self#run ~logout ~logerr - >>= fun r -> - if r = 127 then Task.failed "Command '%s' not found" cmd - else if r <> 0 then self#failed - else Task.return () - - method check = - let cmd = Wp_parameters.CoqCompiler.get () in - self#set_command cmd ; - self#options ; - self#add [ source ] ; - self#timeout (coq_timeout ()) ; - self#run ~logout ~logerr () >>= function - | 127 -> Task.failed "Command '%s' not found" cmd - | 0 -> Task.return true - | 1 -> Task.return false - | _ -> self#failed - - method coqide = - let coqide = Wp_parameters.CoqIde.get () in - self#set_command coqide ; - if is_emacs coqide then - begin - self#project ; - self#add [ source ] ; - end - else - begin - self#options ; - self#add [ source ] ; - end ; - Task.sync coqide_lock (self#run ~logout ~logerr) - end - -(* -------------------------------------------------------------------------- *) -(* --- Compilation Helpers --- *) -(* -------------------------------------------------------------------------- *) - -let shared_demon = ref true -let shared_headers : (string,unit Task.shared) Hashtbl.t = Hashtbl.create 120 - -let shared includes source = - try Hashtbl.find shared_headers source - with Not_found -> - if !shared_demon then - begin - shared_demon := false ; - let server = ProverTask.server () in - Task.on_server_stop server (fun () -> Hashtbl.clear shared_headers) ; - end ; - let shared = Task.shared ~retry:true - (fun () -> (new runcoq includes source)#compile) - in Hashtbl.add shared_headers source shared ; shared - -let rec compile_headers includes forced = function - | [] -> Task.nop - | source::headers -> - let target = source ^ "o" in - if forced || need_recompile ~source ~target then - begin - let cc = shared includes source in - Task.share cc >>= fun () -> compile_headers includes true headers - end - else compile_headers includes forced headers - -(* -------------------------------------------------------------------------- *) -(* --- Coq Prover --- *) -(* -------------------------------------------------------------------------- *) - -let ontty = `Feedback - -open Wpo - -type coq_wpo = { - cw_pid : WpPropId.prop_id ; - cw_gid : string ; - cw_leg : string ; - cw_goal : string ; (* filename for goal without proof *) - cw_script : string ; (* filename for goal with proof script *) - cw_headers : string list ; (* filename for libraries *) - cw_includes : included list ; (* -R ... ... *) -} - -let make_script w script closing = - Command.print_file w.cw_script - begin fun fmt -> - Command.pp_from_file fmt w.cw_goal ; - Format.fprintf fmt "Proof.@\n%s%s@\n@." script closing ; - end - -let try_script w script closing = - make_script w script closing ; - (new runcoq w.cw_includes w.cw_script)#check - -let rec try_hints w = function - | [] -> Task.return false - | (kind,script,closing) :: hints -> - Wp_parameters.feedback ~ontty "[Coq] Goal %s : %s" w.cw_gid kind ; - try_script w script closing >>= fun succeed -> - if succeed then - let required,hints = WpPropId.prop_id_keys w.cw_pid in - let keys = List.merge String.compare required hints in - Proof.add_script_for ~gid:w.cw_gid keys script closing ; - Task.return true - else - try_hints w hints - -let try_prove w = - begin - match Proof.script_for ~pid:w.cw_pid ~gid:w.cw_gid ~legacy:w.cw_leg with - | Some (script,closing) -> - Wp_parameters.feedback ~ontty "[Coq] Goal %s : Saved script" w.cw_gid ; - try_script w script closing - | None -> Task.return false - end - >>= fun succeed -> - if succeed then - Task.return true - else - try_hints w (Proof.hints_for ~pid:w.cw_pid) - -let try_coqide w = - let script,closing = - Proof.script_for_ide ~pid:w.cw_pid ~gid:w.cw_gid ~legacy:w.cw_leg in - make_script w script closing ; - (new runcoq w.cw_includes w.cw_script)#coqide >>= fun st -> - if st = 0 then - match Proof.parse_coqproof w.cw_script with - | None -> - Wp_parameters.feedback "[Coq] No proof found" ; - Task.return false - | Some(script,closing) -> - if Proof.is_empty_script script then - begin - Proof.delete_script_for ~gid:w.cw_gid ; - Task.canceled () ; - end - else - begin - let req,hs = WpPropId.prop_id_keys w.cw_pid in - let hints = List.merge String.compare req hs in - Proof.add_script_for ~gid:w.cw_gid hints script closing ; - Wp_parameters.feedback ~ontty "[Coq] Goal %s : Script" w.cw_gid ; - try_script w script closing - end - else if st = 127 - then Task.failed "CoqIde command '%s' not found" (Wp_parameters.CoqIde.get ()) - else Task.failed "CoqIde exits with status %d." st - -let prove_session ~mode w = - begin - compile_headers w.cw_includes false w.cw_headers >>= - begin fun () -> - match mode with - | Batch | Update -> try_prove w - | Edit -> try_coqide w - | Fix | FixUpdate -> - begin - try_prove w >>> function - | Task.Result true -> Task.return true - | Task.Failed e -> Task.raised e - | Task.Canceled | Task.Timeout _ | Task.Result false -> try_coqide w - end - end - end - >>= Task.call (fun r -> if r then VCS.valid else VCS.unknown) - -let gen_session w = - begin - make_script w " ...\n" "Qed." ; - Wp_parameters.print_generated w.cw_script ; - Task.return VCS.no_result - end - -let prove_session ~mode w = - if Wp_parameters.Generate.get () then - gen_session w - else - prove_session ~mode w - -let prove_prop wpo ~mode ~axioms ~prop = - let pid = wpo.po_pid in - let gid = wpo.po_gid in - let leg = wpo.po_leg in - let model = wpo.po_model in - let context = Wpo.get_context wpo in - let script = DISK.file_goal ~pid ~model ~prover:NativeCoq in - let includes , headers , goal = - WpContext.on_context context (assemble_goal ~pid axioms) prop - in - prove_session ~mode { - cw_pid = pid ; - cw_gid = gid ; - cw_leg = leg ; - cw_goal = goal ; - cw_script = script ; - cw_headers = headers ; - cw_includes = includes ; - } - -let prove_annot wpo vcq ~mode = - Task.todo - begin fun () -> - let prop = - WpContext.on_context (Wpo.get_context wpo) - (GOAL.compute_proof ~pid:wpo.po_pid) vcq.VC_Annot.goal in - prove_prop wpo ~mode ~axioms:None ~prop - end - -let prove_lemma wpo vca ~mode = - Task.todo - begin fun () -> - let lemma = vca.VC_Lemma.lemma in - let depends = vca.VC_Lemma.depends in - let prop = F.p_forall lemma.l_forall lemma.l_lemma in - let axioms = Some(lemma.l_cluster,depends) in - prove_prop wpo ~mode ~axioms ~prop - end - -let prove mode wpo = - match wpo.Wpo.po_formula with - | GoalAnnot vcq -> prove_annot wpo vcq ~mode - | GoalLemma vca -> prove_lemma wpo vca ~mode diff --git a/src/plugins/wp/ProverErgo.ml b/src/plugins/wp/ProverErgo.ml deleted file mode 100644 index e78bb4bb0f79193b9f870cac7d9b4633963886ff..0000000000000000000000000000000000000000 --- a/src/plugins/wp/ProverErgo.ml +++ /dev/null @@ -1,513 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Prover Alt-Ergo Interface --- *) -(* -------------------------------------------------------------------------- *) - -open Cil_types -open Qed -open Lang -open Definitions - -let dkey = Wp_parameters.register_category "prover" -let dkey_cluster = Wp_parameters.register_category "cluster" - -let option_file = LogicBuiltins.create_option - (fun ~driver_dir x -> Filename.concat driver_dir x) - "altergo" "file" - -(* -------------------------------------------------------------------------- *) -(* --- Making Goal File --- *) -(* -------------------------------------------------------------------------- *) - -let altergo_gui = - lazy - begin - let name = Wp_parameters.AltGrErgo.get () in - let x = Command.command name [| "-version" |] in - match x with - | Unix.WEXITED 0 -> true - | Unix.WEXITED 127 -> Wp_parameters.error ~current:false "AltGr-Ergo command '%s' not found." name; false - | Unix.WEXITED r -> Wp_parameters.error ~current:false "AltGr-Ergo command '%s' exits with status [%d]" name r ; false - | _ -> Wp_parameters.error ~current:false "AltGr-Ergo command '%s' does not work." name; false - end - -let append_file out file = - let lines = ref 0 in - Command.read_lines file - begin fun line -> - output_string out line ; - output_string out "\n" ; - incr lines ; - end ; - !lines - -let rec locate_error files file line = - match files with - | [] -> ProverTask.location file line - | (f,n)::files -> - if line <= n then ProverTask.location f line - else locate_error files file (line-n) - -let cluster_file c = - let dir = WpContext.directory () in - let base = cluster_id c in - Format.sprintf "%s/%s.ergo" (dir :> string) base - -(* -------------------------------------------------------------------------- *) -(* --- Exporting Formulae to Alt-Ergo --- *) -(* -------------------------------------------------------------------------- *) - -type depend = - | D_file of string - | D_cluster of cluster - -[@@@warning "-32"] -let pp_depend fmt = function - | D_file file -> Format.fprintf fmt "File %s" file - | D_cluster cluster -> Format.fprintf fmt "Cluster %a" - Definitions.pp_cluster cluster -[@@@warning "+32"] - -module TYPES = WpContext.Index - (struct - type key = adt - type data = tau - let name = "ProverErgo.TYPES" - let compare = ADT.compare - let pretty = ADT.pretty - end) - -let engine = - let module E = Qed.Export_altergo.Make(Lang.F.QED) in - object(self) - inherit E.engine as super - inherit Lang.idprinting - - method infoprover p = p.altergo - method set_typedef = TYPES.define - method get_typedef = TYPES.get - - val mutable share = true - method! shareable e = share && super#shareable e - method! declare_axiom fmt a xs tgs phi = - try share <- false ; super#declare_axiom fmt a xs tgs phi ; share <- true - with err -> share <- true ; raise err - - val mutable goal = false - method set_goal g = goal <- g - - method private is_vlist polarity a b = - goal && self#mode = polarity && - (Vlist.check_term a || Vlist.check_term b) - - method! pp_equal fmt a b = - if self#is_vlist Qed.Engine.Mpositive a b - then Qed.Plib.pp_call_var "vlist_eq" self#pp_term fmt [a;b] - else super#pp_equal fmt a b - - method! pp_noteq fmt a b = - if self#is_vlist Qed.Engine.Mnegative a b - then - begin - Format.fprintf fmt "@[<hov 2>not@,(" ; - Qed.Plib.pp_call_var "vlist_eq" self#pp_term fmt [a;b] ; - Format.fprintf fmt ")@]" ; - end - else super#pp_noteq fmt a b - - method! pp_fun cmode fct ts = - if fct == Vlist.f_concat - then Vlist.export self ts - else super#pp_fun cmode fct ts - - end - -class visitor fmt c = - object(self) - - inherit Definitions.visitor c - inherit ProverTask.printer fmt (cluster_title c) - - val mutable deps = [] - - (* --- Managing Formatter --- *) - - method flush = - begin - Format.pp_print_newline fmt () ; - List.rev deps - end - - (* --- Files, Theories and Clusters --- *) - - method add_dfile f = - let df = D_file f in - if not (List.mem df deps) then deps <- df :: deps - - method add_shared f = self#add_dfile ((Wp_parameters.Share.get_file ~mode:`Must_exist f) :> string) - method add_library f = self#add_dfile f - - method on_cluster c = deps <- (D_cluster c) :: deps - - method on_library thy = - let iter file = self#add_library file in - List.iter iter - (LogicBuiltins.get_option option_file ~library:thy) - - method on_type lt def = - begin - self#lines ; - engine#declare_type fmt (Lang.adt lt) (List.length lt.lt_params) def ; - end - - method private gen_on_comp kind c fts = - begin - self#lines ; - let adt = match kind with - | KValue -> Lang.comp c - | KInit -> Lang.comp_init c - in - let t = match fts with - | None -> Qed.Engine.Tabs - | Some fts -> Qed.Engine.Trec fts - in - engine#declare_type fmt adt 0 t ; - end - - method on_comp = self#gen_on_comp KValue - method on_icomp = self#gen_on_comp KInit - - method on_dlemma l = - begin - self#paragraph ; - engine#declare_axiom fmt - (Lang.lemma_id l.l_name) - l.l_forall l.l_triggers - (F.e_prop l.l_lemma) - end - - method on_dfun d = - begin - self#paragraph ; - match d.d_definition with - | Logic t -> - engine#declare_signature fmt - d.d_lfun (List.map F.tau_of_var d.d_params) t ; - | Function(t,_,v) -> - engine#declare_definition fmt - d.d_lfun d.d_params t v - | Predicate(_,p) -> - engine#declare_definition fmt - d.d_lfun d.d_params Logic.Prop (F.e_prop p) - | Inductive ds -> - engine#declare_signature fmt - d.d_lfun (List.map F.tau_of_var d.d_params) Logic.Prop; - List.iter self#on_dlemma ds - end - - end - -let write_cluster c job = - let f = cluster_file c in - Wp_parameters.debug ~dkey "Generate '%s'" f ; - let output = Command.print_file f - begin fun fmt -> - let v = new visitor fmt c in - engine#set_goal false ; - job v ; - v#flush - end - in - if Wp_parameters.has_dkey dkey_cluster then - Log.print_on_output - begin fun fmt -> - Format.fprintf fmt "---------------------------------------------@\n" ; - Format.fprintf fmt "--- File '%s/%s.ergo' @\n" - (WpContext.get_context () |> WpContext.S.id) (cluster_id c) ; - Format.fprintf fmt "---------------------------------------------@\n" ; - Command.pp_from_file fmt f ; - end ; - output - -(* -------------------------------------------------------------------------- *) -(* --- File Assembly --- *) -(* -------------------------------------------------------------------------- *) - -module CLUSTERS = WpContext.Index - (struct - type key = cluster - type data = int * depend list - let name = "ProverErgo.CLUSTERS" - let compare = cluster_compare - let pretty = pp_cluster - end) - -type export = { - out : out_channel ; - mutable files : (string * int) list ; -} - -let rec assemble export = function - | D_file file -> assemble_file export file - | D_cluster c -> assemble_cluster export c - -and assemble_file export file = - if List.for_all (fun (f,_) -> f <> file) export.files - then - let lines = append_file export.out file in - export.files <- (file,lines) :: export.files - -and assemble_cluster export c = - let (age,deps) = try CLUSTERS.find c with Not_found -> (-1,[]) in - let deps = - if age < cluster_age c then - let deps = write_cluster c (fun v -> v#vself) in - CLUSTERS.update c (cluster_age c , deps) ; deps - else deps - in - List.iter (assemble export) deps ; - let file = cluster_file c in - assemble_file export file - -and assemble_lib export lib = - assemble_file export (LogicBuiltins.find_lib lib) - -(* -------------------------------------------------------------------------- *) -(* --- Assembling Goal --- *) -(* -------------------------------------------------------------------------- *) - -let assemble_goal ~file ~id ~title ~axioms prop = - let goal = cluster ~id ~title () in - let deps = write_cluster goal - begin fun v -> - v#on_library "qed"; - v#vgoal axioms prop ; - v#paragraph ; - try - let qlet = List.mem "qlet" (Wp_parameters.AltErgoFlags.get ()) in - engine#set_quantify_let qlet ; - engine#set_goal true ; - engine#global - begin fun () -> - v#printf "@[<hv 2>goal %s:@ %a@]@." id - engine#pp_goal (F.e_prop prop) ; - end ; - engine#set_quantify_let false ; - engine#set_goal false ; - with error -> - engine#set_quantify_let false ; - engine#set_goal false ; - raise error - end in - Command.write_file file - begin fun out -> - let export = { files = [] ; out = out } in - List.iter (assemble export) deps ; - let libs = Wp_parameters.AltErgoLibs.get () in - List.iter (assemble_lib export) libs ; - assemble_file export (cluster_file goal) ; - List.rev export.files - end - -(* -------------------------------------------------------------------------- *) -(* --- Running AltErgo --- *) -(* -------------------------------------------------------------------------- *) - -open ProverTask - -(*bug in Alt-Ergo: sometimes error messages are repeated. *) -(*let p_loc = "^File " ... *) - -let p_loc = "^File " ^ p_string ^ ", line " ^ p_int ^ ", [^:]+:" -let p_valid = p_loc ^ "Valid (" ^ p_float ^ ") (" ^ p_int ^ "\\( +steps\\)?)" -let p_unsat = p_loc ^ "I don't know" -let p_limit = "^Steps limit reached: " ^ p_int - -let re_error = Str.regexp p_loc -let re_valid = Str.regexp p_valid -let re_limit = Str.regexp p_limit -let re_unsat = Str.regexp p_unsat - -class altergo ~config ~pid ~gui ~file ~lines ~logout ~logerr = - object(ergo) - - inherit ProverTask.command (Wp_parameters.AltErgo.get ()) - - val mutable files = [] - val mutable error = None - val mutable valid = false - val mutable limit = false - val mutable unsat = false - val mutable timer = 0.0 - val mutable steps = 0 - - method private time t = timer <- t - - method private error (a : pattern) = - let lpos = locate_error files (a#get_string 1) (a#get_int 2) in - let message = a#get_after ~offset:1 2 in - error <- Some ( lpos , message ) - - method private valid (a : pattern) = - begin - valid <- true ; - timer <- a#get_float 3 ; - steps <- a#get_int 4 ; - end - - method private limit (a : pattern) = - begin - limit <- true ; - steps <- pred (a#get_int 1) ; - end - - method private unsat (_ : pattern) = - begin - unsat <- true ; - end - - method result r = - if r = 127 then - let cmd = Wp_parameters.AltErgo.get () in - VCS.kfailed "Command '%s' not found" cmd - else - match error with - | Some(pos,message) when unsat || limit || not valid -> - let source = Cil_datatype.Position.of_lexing_pos pos in - Wp_parameters.error ~source "Alt-Ergo error:@\n%s" message ; - VCS.failed ~pos message - | _ -> - try - let verdict = - if unsat then VCS.Unknown else - if valid then VCS.Valid else - if limit then VCS.Stepout else - raise Not_found in - VCS.result - ~time:(if gui then 0.0 else timer) - ~steps verdict - with Not_found -> - begin - let message std = - Format.asprintf - "Alt-Ergo (%s) for goal %a" - std WpPropId.pretty pid - in - if Wp_parameters.verbose_atleast 1 then begin - ProverTask.pp_file ~message:(message "stdout") ~file:logout ; - ProverTask.pp_file ~message:(message "stderr") ~file:logerr ; - end; - if r = 0 then VCS.failed "Unexpected Alt-Ergo output" - else VCS.kfailed "Alt-Ergo exits with status [%d]." r - end - - method prove = - files <- lines ; - if gui then ergo#set_command (Wp_parameters.AltGrErgo.get ()) ; - ergo#add_parameter ~name:"-proof" Wp_parameters.ProofTrace.get ; - ergo#add_parameter ~name:"-model" Wp_parameters.ProofTrace.get ; - let flags = List.filter - (fun p -> p <> "qlet") - (Wp_parameters.AltErgoFlags.get ()) in - ergo#add flags ; - ergo#add [ file ] ; - if not gui then begin - ergo#add_positive - ~name:"-steps-bound" ~value:(VCS.get_stepout config) ; - let smoke = WpPropId.is_smoke_test pid in - ergo#timeout (VCS.get_timeout ~smoke config) ; - end ; - ergo#validate_time ergo#time ; - ergo#validate_pattern ~logs:`ERR re_error ergo#error ; - ergo#validate_pattern ~logs:`OUT re_valid ergo#valid ; - ergo#validate_pattern ~logs:`OUT re_limit ergo#limit ; - ergo#validate_pattern ~logs:`OUT re_unsat ergo#unsat ; - ergo#run ~logout ~logerr () - - end - -open VCS -open Wpo -open Task - -let try_prove ~config ~pid ~gui ~file ~lines ~logout ~logerr = - let ergo = new altergo ~config ~pid ~gui ~file ~lines ~logout ~logerr in - ergo#prove >>> function - | Task.Timeout t -> Task.return (VCS.timeout t) - | Task.Result r -> Task.call ergo#result r - | st -> Task.status (Task.map (fun _ -> assert false) st) - -let prove_file ~config ~pid ~mode ~file ~lines ~logout ~logerr = - let gui = match mode with - | Edit -> Lazy.force altergo_gui - | Batch | Update | Fix | FixUpdate -> false in - try_prove ~config ~pid ~gui ~file ~lines ~logout ~logerr >>= function - | { verdict=(VCS.Unknown|VCS.Timeout|VCS.Stepout) } - when (mode = Fix || mode = FixUpdate) && Lazy.force altergo_gui -> - try_prove ~config ~pid ~gui:true ~file ~lines ~logout ~logerr - | r -> Task.return r - -let prove_prop ~config ~pid ~mode ~context ~axioms ~prop = - let prover = NativeAltErgo in - let model = fst context in - let file = DISK.file_goal ~pid ~model ~prover in - let logout = DISK.file_logout ~pid ~model ~prover in - let logerr = DISK.file_logerr ~pid ~model ~prover in - let id = WpPropId.get_propid pid in - let title = Pretty_utils.to_string WpPropId.pretty pid in - let lines = WpContext.on_context context - (assemble_goal ~file ~id ~title ~axioms) prop in - if Wp_parameters.has_print_generated () then - WpContext.on_context context (fun () -> - let goal = cluster ~id ~title () in - Wp_parameters.print_generated (cluster_file goal) - ) () ; - if Wp_parameters.Generate.get () - then Task.return VCS.no_result - else prove_file ~config ~pid ~mode ~file ~lines ~logout ~logerr - -let prove_annot context pid vcq ~config ~mode = - Task.todo - begin fun () -> - let axioms = vcq.VC_Annot.axioms in - let prop = GOAL.compute_proof ~pid vcq.VC_Annot.goal in - prove_prop ~pid ~config ~mode ~context ~axioms ~prop - end - -let prove_lemma context pid vca ~config ~mode = - Task.todo - begin fun () -> - let lemma = vca.Wpo.VC_Lemma.lemma in - let depends = vca.Wpo.VC_Lemma.depends in - let prop = F.p_forall lemma.l_forall lemma.l_lemma in - let axioms = Some(lemma.l_cluster,depends) in - prove_prop ~pid ~config ~mode ~context ~axioms ~prop - end - -let prove ~config ~mode wpo = - let pid = wpo.Wpo.po_pid in - let context = Wpo.get_context wpo in - match wpo.Wpo.po_formula with - | Wpo.GoalAnnot vcq -> prove_annot context pid vcq ~config ~mode - | Wpo.GoalLemma vca -> prove_lemma context pid vca ~config ~mode diff --git a/src/plugins/wp/ProverScript.ml b/src/plugins/wp/ProverScript.ml index 46f3ae3cf8077927156ad9b07a006b05796503b4..9b4df821321a90605ab696180861dc73c5037a7d 100644 --- a/src/plugins/wp/ProverScript.ml +++ b/src/plugins/wp/ProverScript.ml @@ -36,11 +36,10 @@ struct let stage = function | Prover( Qed , { verdict = Valid } ) -> 0 - | Prover( (NativeAltErgo | Why3 _) , { verdict = Valid } ) -> 1 - | Prover( NativeCoq , { verdict = Valid } ) -> 2 - | Tactic _ -> 3 - | Prover _ -> 4 - | Error _ -> 5 + | Prover( Why3 _ , { verdict = Valid } ) -> 1 + | Tactic _ -> 2 + | Prover _ -> 3 + | Error _ -> 4 let time = function | Tactic _ | Error _ -> 0.0 diff --git a/src/plugins/wp/ProverTask.ml b/src/plugins/wp/ProverTask.ml index 1811bf0a2bb5d253b8cd144f23ca4b5a5cf0a5cf..cb0989a0c924cd1133d9837c78ebbb812dd920e7 100644 --- a/src/plugins/wp/ProverTask.ml +++ b/src/plugins/wp/ProverTask.ml @@ -302,7 +302,6 @@ let server ?procs () = let np = getprocs procs in let s = Task.server ~procs:np () in Why3Provers.set_procs np ; - Task.on_server_stop s Proof.savescripts ; server := Some s ; s (* -------------------------------------------------------------------------- *) diff --git a/src/plugins/wp/ProverWhy3.ml b/src/plugins/wp/ProverWhy3.ml index c0cb6f8e847682f6c7baaf38399a02ed2e4ae69b..e89b87890f82921162f173f4fec10d8bfd3b42c8 100644 --- a/src/plugins/wp/ProverWhy3.ml +++ b/src/plugins/wp/ProverWhy3.ml @@ -140,7 +140,7 @@ let lfun_name (lfun:Lang.lfun) = | ACSL f -> Qed.Engine.F_call (Lang.logic_id f) | CTOR c -> Qed.Engine.F_call (Lang.ctor_id c) | Model({m_source=Generated(_,n)}) -> Qed.Engine.F_call n - | Model({m_source=Extern e}) -> e.Lang.ext_link.Lang.why3 + | Model({m_source=Extern e}) -> e.Lang.ext_link let coerce ~cnv sort expected r = @@ -151,8 +151,8 @@ let coerce ~cnv sort expected r = | _ -> r let name_of_adt = function - | Lang.Mtype a -> a.Lang.ext_link.Lang.why3 - | Mrecord(a,_) -> a.Lang.ext_link.Lang.why3 + | Lang.Mtype a -> a.Lang.ext_link + | Mrecord(a,_) -> a.Lang.ext_link | Comp (c, KValue) -> Lang.comp_id c | Comp (c, KInit) -> Lang.comp_init_id c | Atype lt -> Lang.type_id lt @@ -520,8 +520,7 @@ let rec of_term ~cnv expected t : Why3.Term.term = in match lfun_name f, expected with | F_call s, _ -> apply_from_ns' s l sort - | Qed.Engine.F_subst _, _ -> - why3_failure "Driver link with subst not yet implemented" + | Qed.Engine.F_subst (s, _), _ -> apply_from_ns' s l sort | Qed.Engine.F_left s, _ | Qed.Engine.F_assoc s, _ -> let rec aux = function | [] -> why3_failure "Empty application" diff --git a/src/plugins/wp/RefUsage.ml b/src/plugins/wp/RefUsage.ml index 560df2f561d6b89dec4b452815df43f21035c38a..44d5f5f5b44182122a62a4be701a673ac6673444 100644 --- a/src/plugins/wp/RefUsage.ml +++ b/src/plugins/wp/RefUsage.ml @@ -357,16 +357,13 @@ and expr (e:Cil_types.exp) : model = match e.enode with (* Unary *) | UnOp((Neg|BNot|LNot),e,_) -> mexpr e - (* Jessie *) - | Info(e,_) -> expr e - (* Binary *) | BinOp( (MinusPP|PlusA|MinusA|Mult|Div|Mod |Shiftlt|Shiftrt|BAnd|BXor|BOr|LAnd|LOr |Lt|Gt|Le|Ge|Eq|Ne), a,b,_ ) -> m_vcup (expr a) (vexpr b) (* Shifts *) - | BinOp((PlusPI|IndexPI|MinusPI),a,b,_) -> shift (expr a) (vexpr b) + | BinOp((PlusPI|MinusPI),a,b,_) -> shift (expr a) (vexpr b) (* Casts *) | CastE(ty_tgt,e) -> cast (cast_ctyp ty_tgt (Cil.typeOf e)) (expr e) @@ -419,7 +416,7 @@ and term (env:ctx) (t:term) : model = match t.term_node with |Lt|Gt|Le|Ge|Eq|Ne), a,b ) -> m_vcup (term env a) (vterm env b) (* Shifts *) - | TBinOp((PlusPI|IndexPI|MinusPI),a,b) -> shift (term env a) (vterm env b) + | TBinOp((PlusPI|MinusPI),a,b) -> shift (term env a) (vterm env b) (* Casts *) | TCastE(ty_tgt,t) -> cast (cast_ltyp ty_tgt t.term_type) (term env t) diff --git a/src/plugins/wp/RegionAccess.ml b/src/plugins/wp/RegionAccess.ml index 066f2675a4006e361ce46442c7cde9ff09c492a4..2e47b7ade3a1489e1f8640d2bcbf45a4a8a0b910 100644 --- a/src/plugins/wp/RegionAccess.ml +++ b/src/plugins/wp/RegionAccess.ml @@ -121,7 +121,7 @@ let merge_addrof (map:map) v1 v2 = let rec cc_exp (map:map) exp = match exp.enode with - | BinOp( (PlusPI | IndexPI | MinusPI) , a , b , _ ) -> + | BinOp( (PlusPI | MinusPI) , a , b , _ ) -> cc_read map b ; let { addrof = pointed } as addr = cc_addr map a in acs_shift pointed (Eval exp) ; @@ -134,7 +134,6 @@ let rec cc_exp (map:map) exp = } | Lval lv -> Read_at (Cil.typeOfLval lv , cc_lval map lv) | CastE(ty,e) -> cast ty (cc_exp map e) - | Info(e,_) -> cc_exp map e | Const (CStr _ | CWStr _) -> Addr_of (cc_string map exp) | Const (CInt64 _ | CChr _ | CEnum _ | CReal _) | SizeOf _ | SizeOfE _ | SizeOfStr _ @@ -251,7 +250,7 @@ and cc_term_value (map:map) (term:term) = shift = false ; } end - | TBinOp( (PlusPI | IndexPI | MinusPI) , a , b ) -> + | TBinOp( (PlusPI | MinusPI) , a , b ) -> begin cc_term map b ; let { addrof = pointed } as addr = cc_term_addr map a in diff --git a/src/plugins/wp/Sigs.ml b/src/plugins/wp/Sigs.ml index 83335aaf4119b97eb8924ec181f00f201c45c44b..e8a2b331fbb88c39682c3ed6910505d9c12ae2ca 100644 --- a/src/plugins/wp/Sigs.ml +++ b/src/plugins/wp/Sigs.ml @@ -796,6 +796,11 @@ sig underlying memory model. *) val pred : polarity -> env -> Cil_types.predicate -> pred + (** Compile a predicate call. *) + val call_pred: + env -> Cil_types.logic_info -> Cil_types.logic_label list -> term list -> + pred + (** Compile a term representing a set of memory locations into an abstract region. *) val region : env -> Cil_types.term -> region diff --git a/src/plugins/wp/TacChoice.ml b/src/plugins/wp/TacChoice.ml index 31f3ee05e0cd795e8b57e1464b04e44906b3416e..28ba26f16aed2a59c62767c2ce30958d782fd219 100644 --- a/src/plugins/wp/TacChoice.ml +++ b/src/plugins/wp/TacChoice.ml @@ -45,7 +45,7 @@ class choice = Applicable (fun (hs,_) -> ["Choice",(hs,F.p_bool q)]) | _ -> Not_applicable end - | Empty | Compose _ | Clause _ | Inside(Step _,_) -> + | Empty | Compose _ | Clause _ | Inside(Step _,_) | Multi _ -> Not_applicable end @@ -59,7 +59,7 @@ class absurd = method select _feedback (s : Tactical.selection) = match s with - | Empty | Compose _ | Inside _ | Clause(Goal _) + | Empty | Compose _ | Inside _ | Clause(Goal _) | Multi _ -> Not_applicable | Clause(Step s) -> begin @@ -85,7 +85,7 @@ class contrapose = method select _feedback (s : Tactical.selection) = match s with - | Empty | Compose _ | Inside _ | Clause(Goal _) + | Empty | Compose _ | Inside _ | Clause(Goal _) | Multi _ -> Not_applicable | Clause(Step s) -> begin diff --git a/src/plugins/wp/TacClear.ml b/src/plugins/wp/TacClear.ml index 62492909112d90a938b3be35e092e682a0a44e40..73f33b2e8cfbbac93770098b6c48f349f1013dc7 100644 --- a/src/plugins/wp/TacClear.ml +++ b/src/plugins/wp/TacClear.ml @@ -21,6 +21,59 @@ (**************************************************************************) open Tactical +open Conditions + +let condition original p = (* keep original kind of simple condition *) + match original.condition with + | Type _ -> Type p + | Have _ -> Have p + | When _ -> When p + | Core _ -> Core p + | Init _ -> Init p + | _ -> assert false + +let tactical_step step = + Tactical.replace_single ~at:step.id ("Removed", Conditions.Have Lang.F.p_true) + +module TermLset = Qed.Listset.Make(Lang.F.QED.Term) + +let tactical_inside step remove = + let remove = List.sort_uniq Lang.F.compare remove in + let collect p = + match Lang.F.p_expr p with + | And ps -> ps + | _ -> [ p ] + in + begin match step.condition with + | Type p | Have p | When p | Core p | Init p -> + let ps = Lang.F.e_props @@ collect p in + let ps = TermLset.diff ps remove in + let cond = condition step @@ Lang.F.p_bool @@ Lang.F.e_and ps in + Tactical.replace_single ~at:step.id ("Filtered", cond) + + | _ -> raise Not_found + end + +module Smap = Qed.Idxmap.Make + (struct + type t = step + let id s = s.id + end) + +let collect_remove m = function + | Inside(Step step, remove) -> + let l = + try Smap.find step m + with Not_found -> [] + in + Smap.add step (remove :: l) m + | _ -> raise Not_found + +let fold_selection s seq = + let m = List.fold_left collect_remove Smap.empty s in + "Filtered", Smap.fold (fun s l seq -> snd @@ tactical_inside s l seq) m seq + +let process (f: sequent -> string * sequent) s = [ f s ] class clear = object(_) @@ -32,10 +85,15 @@ class clear = method select _feedback sel = match sel with | Clause(Step step) -> - let removed = [ "Cleared hypothesis", Conditions.Have Lang.F.p_true] in - Applicable (Tactical.replace ~at:step.id removed) - | _ -> - Not_applicable + Applicable(process @@ tactical_step step) + | Inside(Step step, remove) -> + begin + try Applicable(process @@ tactical_inside step [remove]) + with Not_found -> Not_applicable + end + | Multi es -> + Applicable (process @@ fold_selection es) + | _ -> Not_applicable end let tactical = Tactical.export (new clear) diff --git a/src/plugins/wp/TacCompound.ml b/src/plugins/wp/TacCompound.ml index e4fe08b7833af851cf7445e259c0b8f33d092c46..53c984d681cfecf23fc3cf4d69f7318e37b59544 100644 --- a/src/plugins/wp/TacCompound.ml +++ b/src/plugins/wp/TacCompound.ml @@ -209,7 +209,7 @@ class compound = | Clause (Step s) -> process_have feedback s | Clause (Goal p) -> process_goal feedback p | Inside(_,e) -> process_expand feedback ?at:(Tactical.at s) e - | Empty | Compose _ -> raise Not_found + | Empty | Compose _ | Multi _ -> raise Not_found in Applicable process end diff --git a/src/plugins/wp/TacInduction.ml b/src/plugins/wp/TacInduction.ml index 4098efd7c3ab847edd4ddd45b1cc5adc985493fd..7bbe267f4a216bdb8780b32faa3f6ac7d7de2d9d 100644 --- a/src/plugins/wp/TacInduction.ml +++ b/src/plugins/wp/TacInduction.ml @@ -22,22 +22,26 @@ open Lang -type env = { - n : F.var ; - sigma : F.sigma ; - mutable hind : F.pred list ; -} - -let rec strip env p = - match F.p_expr p with - | And ps -> F.p_all (strip env) ps - | _ -> - let p = F.p_subst env.sigma p in - if F.occursp env.n p then - ( env.hind <- p :: env.hind ; F.p_true ) - else p - -let process value n0 seq = +(* remove parts with n from p into hs accumulator *) +let filter_pred n hs p = + F.p_conj @@ List.filter + (fun p -> if F.occursp n p then (hs := p :: !hs ; false) else true) + (match F.p_expr p with And ps -> ps | _ -> [p]) + +(* remove parts with n from step s into hs accumulator *) +let filter_step n hs s = + match s.Conditions.condition with + | (Have _ | Type _ | Core _ | Init _ | When _) -> + Conditions.map_step (filter_pred n hs) s + | (State _ | Branch _ | Either _) as c -> + if F.Vars.mem n s.vars then + (hs := Conditions.pred_cond c :: !hs ; Conditions.step (Have F.p_true)) + else s + +let filter_seq n hs seq = + Conditions.sequence @@ List.map (filter_step n hs) @@ Conditions.list seq + +let process value n0 sequent = (* Transfrom seq into: hyps => (forall n, goal) *) let n = Lang.freshvar ~basename:"n" Qed.Logic.Int in @@ -46,9 +50,10 @@ let process value n0 seq = let vi = F.e_var i in let sigma = Lang.sigma () in F.Subst.add sigma value vn ; - let env = { n ; sigma ; hind = [] } in - let hyps = Conditions.map_sequence (strip env) (fst seq) in - let goal_n = F.p_hyps env.hind @@ F.p_subst sigma (snd seq) in + let seq, goal = Conditions.map_sequent (F.p_subst sigma) sequent in + let hind = ref [] in + let seq = filter_seq n hind seq in + let goal_n = F.p_hyps !hind goal in let goal_i = F.p_subst_var n vi goal_n in (* Base: n = n0 *) @@ -67,7 +72,7 @@ let process value n0 seq = F.p_hyps [F.p_lt vn n0; hind] goal_n in (* All Cases *) - List.map (fun (name,goal) -> name , (hyps,goal)) [ + List.map (fun (name,goal) -> name , (seq,goal)) [ "Base" , goal_base ; "Induction (sup)" , goal_sup ; "Induction (inf)" , goal_inf ; diff --git a/src/plugins/wp/TacModMask.ml b/src/plugins/wp/TacModMask.ml new file mode 100644 index 0000000000000000000000000000000000000000..ac36c191eb812f8cee19bef219f23bfd4eaaa55c --- /dev/null +++ b/src/plugins/wp/TacModMask.ml @@ -0,0 +1,123 @@ +(**************************************************************************) +(* *) +(* This file is part of WP plug-in of Frama-C. *) +(* *) +(* Copyright (C) 2007-2021 *) +(* CEA (Commissariat a l'energie atomique et aux energies *) +(* alternatives) *) +(* *) +(* you can redistribute it and/or modify it under the terms of the GNU *) +(* Lesser General Public License as published by the Free Software *) +(* Foundation, version 2.1. *) +(* *) +(* It is distributed in the hope that it will be useful, *) +(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) +(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) +(* GNU Lesser General Public License for more details. *) +(* *) +(* See the GNU Lesser General Public License version 2.1 *) +(* for more details (enclosed in the file licenses/LGPLv2.1). *) +(* *) +(**************************************************************************) + +open Tactical + +let title_no_revert = "Revert (current: a & m -> a % m+1)" +let title_revert = "Revert (current: m & a -> a % m+1)" + +let v_revert,p_revert = + Tactical.checkbox ~id:"Wp.modmask.revert" + ~title:title_no_revert + ~descr:"Changes operands for modulo" + ~default:false () + +class modmask = + object(self) + inherit Tactical.make + ~id:"Wp.modmask" + ~title:"Mod-Mask" + ~descr:"Converts modulo from/to bitmask" + ~params:[p_revert] + + method select feedback selection = + let open Lang.N in + let open Lang.F in + let open Qed.Logic in + + let e = Tactical.selected selection in + let at = Tactical.at selection in + + let on_cond = Tactical.condition in + let replace_with d v = Tactical.rewrite ?at [ d, Lang.F.p_true, e, v ] in + + let update_title ~hard = + feedback#set_title "Mod-Mask%s" (if hard then " (hard)" else "") + in + let update_field ~enabled = + let revert = self#get_field v_revert in + let title = if revert then title_revert else title_no_revert in + feedback#update_field ~enabled v_revert ; + feedback#update_field ~title v_revert + in + let update_display ~hard ~active_field = + update_title ~hard ; + update_field ~enabled:active_field + in + match Lang.F.repr e with + | Mod(a, m) -> + begin + try + let m = Cint.l_lsl e_one @@ Cint.match_power2 m in + let n = Cint.l_and a (m - e_one) in + let cond = a >= e_zero in + + update_display ~hard:false ~active_field:false ; + Applicable (on_cond "Mask Guard" cond @@ replace_with "Mask" n) + + with Not_found -> + let power_of_2 = + let v = Lang.freshvar ~basename:"n" Lang.t_int in + let tv = e_var v in + p_exists [v] (e_zero <= tv && m = Cint.l_lsl e_one tv) + in + let cond = (a >= e_zero && e_zero < m && power_of_2) in + let n = Cint.l_and a (m - e_one) in + + update_display ~hard:true ~active_field:false ; + Applicable (on_cond "Mask Guard" cond @@ replace_with "Mask" n) + end + + | Fun( f , [ a ; b ] ) when Lang.Fun.equal f Cint.f_land -> + begin + try + let a, m = + try b, Cint.match_power2_minus1 a + with Not_found -> a, Cint.match_power2_minus1 b + in + + let cond = a >= e_zero in + let n = a mod (Cint.l_lsl e_one m) in + + update_display ~hard:false ~active_field:false ; + Applicable (on_cond "Mod Guard" cond @@ replace_with "Mod" n) + + with Not_found -> + let a, m = if self#get_field v_revert then b, a else a, b in + let plus_1_power_of_2 = + let v = Lang.freshvar ~basename:"n" Lang.t_int in + let tv = e_var v in + p_exists [v] (e_zero <= tv && m + e_one = Cint.l_lsl e_one tv) + in + let cond = (a >= e_zero && e_zero <= m && plus_1_power_of_2) in + let n = a mod (m + e_one) in + + update_display ~hard:true ~active_field:true ; + Applicable (on_cond "Mod Guard" cond @@ replace_with "Mod" n) + end + + | _ -> + update_display ~hard:false ~active_field:false ; + Not_applicable + end + +let modmask = Tactical.export (new modmask) diff --git a/src/plugins/wp/ProverCoq.mli b/src/plugins/wp/TacModMask.mli similarity index 84% rename from src/plugins/wp/ProverCoq.mli rename to src/plugins/wp/TacModMask.mli index 35287cc626049deb497a95353d6737e3e44b587a..fb0f0f4daf14c2bea477c92e0e0dad1ffa8895ec 100644 --- a/src/plugins/wp/ProverCoq.mli +++ b/src/plugins/wp/TacModMask.mli @@ -20,11 +20,4 @@ (* *) (**************************************************************************) -open Task -open VCS - -(* -------------------------------------------------------------------------- *) -(* --- Alt-Ergo Theorem Prover --- *) -(* -------------------------------------------------------------------------- *) - -val prove : mode -> Wpo.t -> result task +val modmask : Tactical.tactical diff --git a/src/plugins/wp/TacNormalForm.ml b/src/plugins/wp/TacNormalForm.ml index f7e78a439060a170bec100c699899079258360b4..a3ca166d4d31e5b3cb6d4270a67f56d0a6ae19a9 100644 --- a/src/plugins/wp/TacNormalForm.ml +++ b/src/plugins/wp/TacNormalForm.ml @@ -73,7 +73,7 @@ let match_selection = function else Some (false, e, f_nf_hyp s e) | _ -> None end - | Inside(_,_) | Compose _ | Empty -> None + | Inside(_,_) | Compose _ | Empty | Multi _ -> None class normal_form = object diff --git a/src/plugins/wp/TacSequence.ml b/src/plugins/wp/TacSequence.ml index 3671cd67b73db65cf679ea358e3a6b56640dba10..ab689630267f2bfc69790deb410b7399075391ad 100644 --- a/src/plugins/wp/TacSequence.ml +++ b/src/plugins/wp/TacSequence.ml @@ -53,36 +53,59 @@ class sequence = ~descr:"Unroll repeat-sequence operator" ~params:[pmode] - method select _feedback (s : Tactical.selection) = + method select feedback (s : Tactical.selection) = let value = Tactical.selected s in match F.repr value with | Fun(f,[a;n]) when f == Vlist.f_repeat -> let result = F.typeof value in let at = Tactical.at s in - Tactical.Applicable - begin - match self#get_field vmode with - | `Sum -> - let ns = sum n in - let pos = F.p_all positive ns in - let cat = concat ~result (List.map (repeat ~result a) ns) in - Tactical.condition "Positive" pos @@ - Tactical.rewrite ?at [ "Unroll" , pos , value , cat ] - | `Left -> - let p = F.e_add n F.e_minus_one in - let unroll = concat ~result [a ; repeat ~result a p] in + begin + match self#get_field vmode with + | `Sum -> + (* n1>=0 && n2>=0 && ... |- (a *^ (n1 + n2 + ...)) -+-> ((a *^ n1) ^ (a *^ n2) ^ ...) *) + begin + match sum n with + | [ s ] -> + feedback#set_descr + "Cannot unroll with selected option, '%a' is not a sum" + F.pp_term s ; + Tactical.Not_configured + | ns -> + (* NB. the term is rewriten in itself when the initial term is not a sum *) + let pos = F.p_all positive ns in + let cat = + concat ~result (List.map (repeat ~result a) ns) in + feedback#set_descr + "Unroll repeat-sequence: unroll sum" ; + Tactical.Applicable ( + Tactical.condition "Positive" pos @@ + Tactical.rewrite ?at [ "Unroll" , pos , value , cat ]) + end + | `Left -> + (* n<=0 |- (a *^ n) -+-> [] *) + (* n-1>=0 |- (a *^ n) -+-> (a ^ (a *^ (n-1))) *) + let p = F.e_add n F.e_minus_one in + let unroll = concat ~result [a ; repeat ~result a p] in + feedback#set_descr + "Unroll repeat-sequence: unroll first element" ; + Tactical.Applicable( Tactical.rewrite ?at [ "Nil", negative n , value , concat ~result [] ; "Unroll", positive p , value , unroll ; - ] - | `Right -> - let p = F.e_add n F.e_minus_one in - let unroll = concat ~result [repeat ~result a p ; a] in + ]) + | `Right -> + (* n<=0 |- (a *^ n) -+-> [] *) + (* n-1>=0 |- (a *^ n) -+-> ((a *^ (n-1)) ^ a) *) + let p = F.e_add n F.e_minus_one in + let unroll = concat ~result [repeat ~result a p ; a] in + feedback#set_descr + "Unroll repeat-sequence: unroll last element" ; + Tactical.Applicable( Tactical.rewrite ?at [ "Nil", negative n , value , concat ~result [] ; "Unroll", positive p , value , unroll ; - ] - end + ]) + end | _ -> Not_applicable end diff --git a/src/plugins/wp/TacSplit.ml b/src/plugins/wp/TacSplit.ml index 1e20d4073b31635a76f08fe062d01ad23e966d37..20857de0be03c63f38eaaf97c345129968666858 100644 --- a/src/plugins/wp/TacSplit.ml +++ b/src/plugins/wp/TacSplit.ml @@ -187,7 +187,7 @@ class split = split_cmp at "Split (<)" x y in match s with - | Empty | Compose _ -> Not_applicable + | Empty | Compose _ | Multi _ -> Not_applicable | Inside(_,e) -> begin let at = Tactical.at s in diff --git a/src/plugins/wp/TacUnfold.ml b/src/plugins/wp/TacUnfold.ml index fd4f9e3a3b9ef8abe8f678b03fc1c98c42e598d4..e64bfec45f97b0c11f2004a0050c429fc77fc090 100644 --- a/src/plugins/wp/TacUnfold.ml +++ b/src/plugins/wp/TacUnfold.ml @@ -22,6 +22,7 @@ open Lang open Tactical +open Conditions (* -------------------------------------------------------------------------- *) (* --- Unfold Definition Tactical --- *) @@ -48,6 +49,8 @@ let range f es = (F.p_leq e (F.e_zint b)) in F.e_prop (F.p_all range es) +(* Used only for non Multi selection *) + let rec applicable ?at e f es = function | phi::others -> begin @@ -61,6 +64,82 @@ let rec applicable ?at e f es = function | [] -> Not_applicable +(* Used only for Multi selection *) + +module Smap = Qed.Idxmap.Make + (struct + type t = step + let id s = s.id + end) + +let condition original p = (* keep original kind of simple condition *) + match original.condition with + | Type _ -> Type p + | Have _ -> Have p + | When _ -> When p + | Core _ -> Core p + | Init _ -> Init p + | _ -> assert false + +let collect_term_to_unfold (g, m) = function + | Inside(Step step, unfold) -> + let l = + try Smap.find step m + with Not_found -> [] + in + g, Smap.add step (unfold :: l) m + | Inside (Goal _, unfold) -> + begin match g with + | None -> Some [ unfold ], m + | Some g -> Some (unfold :: g), m + end + | _ -> raise Not_found + +let rec collect_unfold phis m e = + match phis with + | phi :: others -> + begin + try + match F.repr e with + | Qed.Logic.Fun(f,es) -> Lang.F.Tmap.add e (phi f es) m + | _ -> raise Not_found + with Not_found | Invalid_argument _ -> collect_unfold others m e + end + | [] -> m + +let unfolds_from_list phis es = + List.fold_left (collect_unfold phis) Lang.F.Tmap.empty es + +let unfolds_from_smap phis m = + Smap.map (fun _s es -> unfolds_from_list phis es) m + +let tactical_inside step unfolds sequent = + if Lang.F.Tmap.is_empty unfolds + then raise Not_found + else match step.condition with + | Type p | Have p | When p | Core p | Init p -> + let subst t = Lang.F.Tmap.find t unfolds in + let p = condition step @@ Lang.p_subst subst p in + snd @@ Tactical.replace_single ~at:step.id ("Unfolded", p) sequent + | _ -> raise Not_found + +let tactical_goal unfolds (seq, g) = + if Lang.F.Tmap.is_empty unfolds + then raise Not_found + else + let subst t = Lang.F.Tmap.find t unfolds in + seq, Lang.p_subst subst g + +let fold_selection goal_unfolds step_unfolds sequent = + "Unfolded multiple selection", + let add_goal = match goal_unfolds with + | None -> Extlib.id + | Some goal_unfolds -> tactical_goal goal_unfolds + in + add_goal @@ Smap.fold tactical_inside step_unfolds sequent + +let process (f: sequent -> string * sequent) s = [ f s ] + class unfold = object inherit Tactical.make ~id:"Wp.unfold" @@ -69,13 +148,21 @@ class unfold = ~params:[] method select _feedback (s : Tactical.selection) = - let at = Tactical.at s in - let e = Tactical.selected s in - match F.repr e with - | Qed.Logic.Fun(f,es) -> - applicable ?at e f es [ definition ; range ] - | _ -> Not_applicable - + let unfoldings = [ definition ; range ] in + match s with + | Multi es -> + let goal, steps = + List.fold_left collect_term_to_unfold (None, Smap.empty) es in + let goal = Option.map (unfolds_from_list unfoldings) goal in + let steps = unfolds_from_smap unfoldings steps in + Applicable (process @@ fold_selection goal steps) + | s -> + let at = Tactical.at s in + let e = Tactical.selected s in + match F.repr e with + | Qed.Logic.Fun(f,es) -> + applicable ?at e f es unfoldings + | _ -> Not_applicable end let tactical = Tactical.export (new unfold) diff --git a/src/plugins/wp/Tactical.ml b/src/plugins/wp/Tactical.ml index 5fcf6a7bc0aec260d59eceab49216c724886e241..1da597fa8d3801f73d9ccea94c08f929a52f5d03 100644 --- a/src/plugins/wp/Tactical.ml +++ b/src/plugins/wp/Tactical.ml @@ -79,6 +79,7 @@ type selection = | Clause of clause | Inside of clause * term | Compose of compose + | Multi of selection list and compose = | Cint of Integer.t @@ -105,6 +106,7 @@ let selected = function | Inside(_,t) -> t | Clause c -> e_prop (head c) | Compose code -> composed code + | Multi _s -> e_true (* For now, do not provide this *) let get_int_z z = try Some (Integer.to_int_exn z) with Z.Overflow -> None @@ -148,6 +150,10 @@ let rec pp_selection fmt = function Format.fprintf fmt "@[<hov 2>Compose '%s'" id ; List.iter (fun e -> Format.fprintf fmt "(%a)" pp_selection e) es ; Format.fprintf fmt "@]" + | Multi es -> + Format.fprintf fmt "@[<hov 2>Multi-selection" ; + List.iter (fun e -> Format.fprintf fmt "(%a)" pp_selection e) es ; + Format.fprintf fmt "@]" let int a = Compose(Cint (Integer.of_int a)) let cint a = Compose(Cint a) @@ -161,6 +167,8 @@ let compose id es = | _ -> Compose(Code(e,id,es)) with Not_found -> Empty +let multi es = Multi es + let findhead (s:selection) e = match s with | Empty -> None @@ -172,6 +180,7 @@ let findhead (s:selection) e = else None | Compose(Code(v,_,_)) as s -> if v == e then Some s else None + | Multi _ -> None let rec lookup (s:selection) e q = match findhead s e with @@ -334,7 +343,7 @@ class type feedback = (* -------------------------------------------------------------------------- *) let at = function - | Empty | Clause (Goal _) | Inside(Goal _,_) | Compose _ -> None + | Empty | Clause (Goal _) | Inside(Goal _,_) | Compose _ | Multi _ -> None | Clause (Step s) | Inside(Step s,_) -> Some s.id let mapi f cases = @@ -357,6 +366,10 @@ let replace ~at cases sequent = descr , Conditions.replace ~at step sequent) cases +let replace_single ~at (descr,cond) sequent = + let step = Conditions.(step ~descr cond) in + descr , Conditions.replace ~at step sequent + let replace_step ~at conditions sequent = let step = let s = Conditions.step_at (fst sequent) at in diff --git a/src/plugins/wp/Tactical.mli b/src/plugins/wp/Tactical.mli index 78159e588ce5e6cca5b7a0ccb4549e422a8f3739..f7ea9130bf0abf129ce56511608662878bdcbd4f 100644 --- a/src/plugins/wp/Tactical.mli +++ b/src/plugins/wp/Tactical.mli @@ -41,6 +41,7 @@ type selection = | Clause of clause | Inside of clause * term | Compose of compose + | Multi of selection list and compose = private | Cint of Integer.t @@ -51,6 +52,7 @@ val int : int -> selection val cint : Integer.t -> selection val range : int -> int -> selection val compose : string -> selection list -> selection +val multi : selection list -> selection val get_int : selection -> int option val destruct : selection -> selection list @@ -179,6 +181,7 @@ val at : selection -> int option val mapi : (int -> int -> 'a -> 'b) -> 'a list -> 'b list val insert : ?at:int -> (string * pred) list -> process val replace : at:int -> (string * condition) list -> process +val replace_single : at:int -> string * condition -> sequent -> string * sequent val replace_step : at:int -> condition list -> process val split : (string * pred) list -> process val rewrite : ?at:int -> (string * pred * term * term) list -> process diff --git a/src/plugins/wp/VCS.ml b/src/plugins/wp/VCS.ml index 05aacf11a7cd7dffab4c1608e0368110c98ffa57..2faa6011629180a42c57748deef6e8074fd42600 100644 --- a/src/plugins/wp/VCS.ml +++ b/src/plugins/wp/VCS.ml @@ -28,8 +28,6 @@ let dkey_shell = Wp_parameters.register_category "shell" type prover = | Why3 of Why3Provers.t (* Prover via WHY *) - | NativeAltErgo (* Direct Alt-Ergo *) - | NativeCoq (* Direct Coq and Coqide *) | Qed (* Qed Solver *) | Tactical (* Interactive Prover *) @@ -43,18 +41,6 @@ type mode = let parse_prover = function | "" | "none" -> None | "qed" | "Qed" -> Some Qed - | "native-alt-ergo" (* for wp-reports *) - | "native:alt-ergo" | "native:altgr-ergo" - -> - Wp_parameters.warning ~once:true ~current:false - "native support for alt-ergo is deprecated, use why3 instead" ; - Some NativeAltErgo - | "native-coq" (* for wp-reports *) - | "native:coq" | "native:coqide" | "native:coqedit" - -> - Wp_parameters.warning ~once:true ~current:false - "native support for coq is deprecated, use tip instead" ; - Some NativeCoq | "script" -> Some Tactical | "tip" -> Some Tactical | "why3" -> Some (Why3 { Why3.Whyconf.prover_name = "why3"; @@ -90,8 +76,6 @@ let parse_mode m = let name_of_prover = function | Why3 s -> Why3Provers.print_wp s - | NativeAltErgo -> "native:alt-ergo" - | NativeCoq -> "native:coq" | Qed -> "qed" | Tactical -> "script" @@ -100,8 +84,6 @@ let title_of_prover = function if Wp_parameters.has_dkey dkey_shell then Why3Provers.name s else Why3Provers.title s - | NativeAltErgo -> "Alt-Ergo (native)" - | NativeCoq -> "Coq (native)" | Qed -> "Qed" | Tactical -> "Script" @@ -128,14 +110,12 @@ let sanitize_why3 s = let filename_for_prover = function | Why3 s -> sanitize_why3 (Why3Provers.print_wp s) - | NativeAltErgo -> "Alt-Ergo" - | NativeCoq -> "Coq" | Qed -> "Qed" | Tactical -> "Tactical" let is_auto = function - | Qed | NativeAltErgo -> true - | Tactical | NativeCoq -> false + | Qed -> true + | Tactical -> false | Why3 p -> match p.prover_name with | "Alt-Ergo" | "CVC4" | "Z3" -> true @@ -152,15 +132,9 @@ let cmp_prover p q = | Qed , Qed -> 0 | Qed , _ -> (-1) | _ , Qed -> 1 - | NativeAltErgo , NativeAltErgo -> 0 - | NativeAltErgo , _ -> (-1) - | _ , NativeAltErgo -> 1 | Tactical , Tactical -> 0 | Tactical , _ -> (-1) | _ , Tactical -> 1 - | NativeCoq , NativeCoq -> 0 - | NativeCoq , _ -> (-1) - | _ , NativeCoq -> 1 | Why3 p , Why3 q -> Why3Provers.compare p q let pp_prover fmt p = Format.pp_print_string fmt (title_of_prover p) @@ -344,7 +318,6 @@ let pp_result fmt r = let is_qualified prover result = match prover with | Qed | Tactical -> true - | NativeAltErgo | NativeCoq -> result.verdict <> Timeout | Why3 _ -> result.cached || result.prover_time < Rformat.epsilon let pp_cache_miss fmt st updating prover result = diff --git a/src/plugins/wp/VCS.mli b/src/plugins/wp/VCS.mli index f45575f2b6db70a52287db1638d9c8208e102bd8..7d81ce1743c382abc88859f5c3fc9b9f6e5363f9 100644 --- a/src/plugins/wp/VCS.mli +++ b/src/plugins/wp/VCS.mli @@ -28,8 +28,6 @@ type prover = | Why3 of Why3Provers.t (** Prover via WHY *) - | NativeAltErgo (** Direct Alt-Ergo *) - | NativeCoq (** Direct Coq and Coqide *) | Qed (** Qed Solver *) | Tactical (** Interactive Prover *) diff --git a/src/plugins/wp/Vlist.ml b/src/plugins/wp/Vlist.ml index a748662b125a457d52fe8821f12b718bf4427423..76423f7fee8de99ce2a543a5d264bc5c18128ed5 100644 --- a/src/plugins/wp/Vlist.ml +++ b/src/plugins/wp/Vlist.ml @@ -23,6 +23,9 @@ (* -------------------------------------------------------------------------- *) (* --- VList Builtins --- *) (* -------------------------------------------------------------------------- *) +let dkey = Wp_parameters.register_category "sequence" +let debug fmt = Wp_parameters.debug ~dkey fmt +let debugN level fmt = Wp_parameters.debug ~level ~dkey fmt open Lang open Lang.F @@ -38,18 +41,10 @@ let library = "vlist" (*--- Linked Symbols ---*) let t_list = "\\list" -let l_list = Lang.infoprover "list" -let l_concat = Lang.infoprover (E.F_right "concat") -let l_elt = Lang.(E.({ - altergo = F_subst "cons(%1,nil)" ; - why3 = F_call "elt" ; - coq = F_subst "(cons %1 nil)" ; - })) -let l_repeat = Lang.(E.({ - altergo = F_call "repeat_box" ; - why3 = F_call "repeat" ; - coq = F_call "repeat" ; - })) +let l_list = "list" +let l_concat = E.F_right "concat" +let l_elt = E.(F_call "elt") +let l_repeat = E.(F_call "repeat") (*--- Typechecking ---*) @@ -121,39 +116,75 @@ let () = add_builtin "\\repeat" [A;Z] f_repeat ; end +let category e = + match F.repr e with + | Qed.Logic.Fun (f,_) when Fun.equal f f_nil -> "Nil" + | Qed.Logic.Fun (f,_) when Fun.equal f f_cons -> "Cons" + | Qed.Logic.Fun (f,_) when Fun.equal f f_nth -> "Nth" + | Qed.Logic.Fun (f,_) when Fun.equal f f_length -> "Length" + | Qed.Logic.Fun (f,_) when Fun.equal f f_concat -> "Concat" + | Qed.Logic.Fun (f,_) when Fun.equal f f_repeat -> "Repeat" + | _ -> "_" + +let rec pp_pattern fmt e = + match F.repr e with + | Qed.Logic.Fun (f, args) when Fun.equal f f_nil || + Fun.equal f f_cons || + Fun.equal f f_nth || + Fun.equal f f_length || + Fun.equal f f_concat || + Fun.equal f f_repeat -> Format.fprintf fmt "(%s %a)" (category e) (Format.pp_print_list ~pp_sep:(fun fmt () -> Format.pp_print_string fmt " ") pp_pattern) args + | _ -> Format.pp_print_string fmt "_" + (*--- Smart Constructors ---*) -let is_nil e = +let is_nil e = (* under-approximation of e==[] *) match F.repr e with | Qed.Logic.Fun (f,_) -> Fun.equal f f_nil | _ -> false + let v_nil t = F.e_fun ~result:t f_nil [] let v_elt e = F.e_fun f_elt [e] let v_concat es tau = F.e_fun f_concat es ~result:tau let v_length l = F.e_fun f_length [l] -let v_repeat s n = F.e_fun f_repeat [s;n] +let v_repeat s n tau = F.e_fun f_repeat [s;n] ~result:tau (* -------------------------------------------------------------------------- *) (* --- Rewriters --- *) (* -------------------------------------------------------------------------- *) -let rewrite_cons a w tau = v_concat [v_elt a ; w] (vlist_get_tau tau) +let rewrite_cons a w tau = (* a::w == [a]^w *) + v_concat [v_elt a ; w] (vlist_get_tau tau) let rewrite_length e = match F.repr e with - | L.Fun( nil , [] ) when nil == f_nil -> F.e_zero - | L.Fun( elt , [_] ) when elt == f_elt -> F.e_one - | L.Fun( concat , es ) when concat == f_concat -> + | L.Fun( nil , [] ) when nil == f_nil -> F.e_zero (* \length([]) == 0 *) + | L.Fun( elt , [_] ) when elt == f_elt -> F.e_one (* \length([x]) == 1 *) + | L.Fun( concat , es ) when concat == f_concat -> (* \length(\concat(...,x_i,...)) == \sum(...,\length(x_i),...) *) F.e_sum (List.map v_length es) - | L.Fun( repeat , [ u ; n ] ) when repeat == f_repeat && - Cint.is_positive_or_null n -> - F.e_mul (v_length u) n + | L.Fun( repeat , [ u ; n ] ) when repeat == f_repeat -> + (* \length(u ^* n) == if 0<=n then n * \length(u) else 0 *) + F.e_if (F.e_leq e_zero n) (F.e_mul n (v_length u)) e_zero + | _ -> + (* NB. do not considers \Cons because they are removed *) + raise Not_found + +let match_natural k = + match F.repr k with + | L.Kint z -> + let k = try Integer.to_int_exn z with Z.Overflow -> raise Not_found in + if 0 <= k then k else raise Not_found | _ -> raise Not_found +(* Why3 definition: [\nth(e,k)] is undefined for [k<0 || k>=\length(e)]. + So, the list cannot be destructured when the length is unknown *) let rec get_nth k e = match F.repr e with | L.Fun( concat , list ) when concat == f_concat -> get_nth_list k list - | L.Fun( elt , [x] ) when elt == f_elt && k = 0 -> x + | L.Fun( elt , [x] ) when elt == f_elt -> + get_nth_elt k x (fun _ -> raise Not_found) + | L.Fun( repeat , [x;n] ) when repeat == f_repeat -> + get_nth_repeat k x n (fun _ -> raise Not_found) | _ -> raise Not_found and get_nth_list k = function @@ -161,37 +192,78 @@ and get_nth_list k = function begin match F.repr head with | L.Fun( elt , [x] ) when elt == f_elt -> - if k = 0 then x else get_nth_list (k-1) tail + get_nth_elt k x (fun k -> get_nth_list k tail) + | L.Fun( repeat , [x;n] ) when repeat == f_repeat -> + get_nth_repeat k x n (fun k -> get_nth_list k tail) | _ -> raise Not_found end | [] -> raise Not_found +and get_nth_elt k x f = + if k = 0 then x else (f (k-1)) + +and get_nth_repeat k x n f = + let n = match_natural n in + if n = 0 then raise Not_found ; + let m = match_natural (rewrite_length x) in + if m = 0 then raise Not_found ; + let en = Integer.of_int n in + let em = Integer.of_int m in + let ek = Integer.of_int k in + if Integer.(ge ek (mul en em)) then f (k -(n*m)) + else get_nth (k mod m) x + let rewrite_nth s k = - match F.repr k with - | L.Kint z -> - let k = try Integer.to_int_exn z with Z.Overflow -> raise Not_found in - if 0 <= k then get_nth k s else raise Not_found - | _ -> raise Not_found + get_nth (match_natural k) s let rewrite_repeat s n = - if F.equal n e_zero then v_nil (F.typeof s) else - if F.equal n e_one then s else - if is_nil s then s else + if F.decide (F.e_leq n e_zero) then (* n <=0 ==> (s *^ n) == [] *) + v_nil (F.typeof s) + else if F.equal n e_one then (* (s *^ 1) == s *) + s + else if is_nil s then (* ([] *^ n) == [] ; even if [n] is negative *) + s + else match F.repr s with - | L.Fun( repeat , [s0 ; n0] ) + | L.Fun( repeat , [s0 ; n0] ) (* n0>=0 && n>=0 ==> ((s0 *^ n0) *^ n) == (s0 *^ (n0 * n)) *) when (repeat == f_repeat) && (Cint.is_positive_or_null n) && - (Cint.is_positive_or_null n0) -> v_repeat s0 (F.e_mul n0 n) + (Cint.is_positive_or_null n0) -> v_repeat s0 (F.e_mul n0 n) (F.typeof s) | _ -> raise Not_found let rec leftmost a ms = match F.repr a with | L.Fun( concat , e :: es ) when concat == f_concat -> leftmost e (es@ms) - | L.Fun( repeat , [ u ; n ] ) when repeat == f_repeat && Cint.is_positive_or_null n -> - leftmost u (v_repeat u (F.e_sub n F.e_one) :: ms) + | L.Fun( repeat , [ u ; n ] ) when repeat == f_repeat -> begin + match (* tries to perform some rolling that do not depend on [n] *) + (match ms with + | b::ms -> + let b,ms = leftmost b ms in + let u,us = leftmost u [] in + if F.decide (F.e_eq u b) then + (* u=b ==> ((u^us)*^n) ^ b ^ ms == u ^ (us^b)*^n) ^ ms *) + Some (u, v_repeat (v_concat (us@[b]) (F.typeof a)) n (F.typeof a) :: ms) + else None + | _ -> None) with + | Some res -> res + | None -> + if F.decide (F.e_lt F.e_zero n) then + (* 0<n ==> (u*^n) ^ ms == u ^ (u*^(n-1)) ^ ms *) + leftmost u (v_repeat u (F.e_sub n F.e_one) (F.typeof a) :: ms) + else a , ms + end | _ -> a , ms +(* [leftmost a] returns [s,xs] such that [a = s ^ x1 ^ ... ^ xn] *) +let leftmost a = + let r = leftmost a [] in + debugN 2 "Vlist.leftmost %a@ = %a (form: %s) ^ ... (%d more)@." + Lang.F.pp_term a + Lang.F.pp_term (fst r) (category (fst r)) + (List.length (snd r)) ; + r + let rec rightmost ms a = match F.repr a with | L.Fun( concat , es ) when concat == f_concat -> @@ -199,72 +271,182 @@ let rec rightmost ms a = | [] -> ms , a | e::es -> rightmost (ms @ List.rev es) e end - | L.Fun( repeat , [ u ; n ] ) when repeat == f_repeat && Cint.is_positive_or_null n -> - rightmost (ms @ [v_repeat u (F.e_sub n F.e_one)]) u + | L.Fun( repeat , [ u ; n ] ) when repeat == f_repeat -> begin + match (* tries to perform some rolling that do not depend on [n] *) + (match List.rev ms with + | b::ms -> + let ms,b = rightmost (List.rev ms) b in + let us,u = rightmost [] u in + if F.decide (F.e_eq u b) then + (* u=b ==> (ms ^ b ^ (us^u)*^n) == ms ^ (b^us)*^n) ^ u *) + Some (ms @ [ v_repeat (v_concat (b::us) (F.typeof a)) n (F.typeof a)], u) + else None + | _ -> None) with + | Some res -> res + | None -> + if F.decide (F.e_lt F.e_zero n) then + (* 0<n ==> ms ^ (u*^n) == ms ^ (u*^(n-1)) ^ u *) + rightmost (ms @ [v_repeat u (F.e_sub n F.e_one) (F.typeof a)]) u + else ms , a + end | _ -> ms , a +(* [rightmost a] returns [s,xs] such that [a = x1 ^ ... ^ xn ^ s] *) +let rightmost a = + let r = rightmost [] a in + debugN 2 "Vlist.rightmost %a@ = (%d more) ... ^ %a (form: %s)@." + Lang.F.pp_term a + (List.length (fst r)) + Lang.F.pp_term (snd r) (category (snd r)); + r + let leftmost_eq a b = - let a , u = leftmost a [] in - let b , v = leftmost b [] in + let a , u = leftmost a in + let b , v = leftmost b in if u <> [] || v <> [] then match F.is_equal a b with - | L.Yes -> F.p_equal (v_concat u (F.typeof a)) (v_concat v (F.typeof a)) - | L.No -> F.p_false - | L.Maybe -> raise Not_found + | L.Yes -> + (* s ^ u1 ^ ... = s ^ v1 ^ ... <=> u1 ^ ... = v1 ^ ... *) + F.p_equal (v_concat u (F.typeof a)) (v_concat v (F.typeof a)) + | L.No when F.decide (F.e_eq (v_length a) (v_length b)) -> + (* a <> b && \length(a)=\length(b) ==> a ^ u1 ^ ... <> b ^ v1 ^ ... *) + F.p_false + | _ -> raise Not_found else raise Not_found let rightmost_eq a b = - let u , a = rightmost [] a in - let v , b = rightmost [] b in + let u , a = rightmost a in + let v , b = rightmost b in if u <> [] || v <> [] then match F.is_equal a b with - | L.Yes -> F.p_equal (v_concat u (F.typeof a)) (v_concat v (F.typeof a)) - | L.No -> F.p_false - | L.Maybe -> raise Not_found + | L.Yes -> + (* u1 ^ ... ^ s = v1 ^ ... ^ s <=> u1 ^ ... = v1 ^ ... *) + F.p_equal (v_concat u (F.typeof a)) (v_concat v (F.typeof a)) + | L.No when F.decide (F.e_eq (v_length a) (v_length b)) -> + (* a <> b && \length(a)=\length(b) ==> u1 ^ ... ^ a <> v1 ^ ... ^ b *) + F.p_false + | _ -> raise Not_found else raise Not_found -let p_is_nil a = F.p_equal a (v_nil (F.typeof a)) -let rewrite_is_nil a = +let rewrite_is_nil ~nil a = + let p_is_nil a = F.p_equal nil a in match F.repr a with - | L.Fun(concat,es) when concat == f_concat -> F.p_all p_is_nil es - | L.Fun(elt,[_]) when elt == f_elt -> F.p_false - | L.Fun(repeat,[u;n]) when repeat == f_repeat -> - F.p_or (F.p_leq n F.e_zero) (p_is_nil u) + | L.Fun(concat,es) when concat == f_concat -> + (* \concat (s1,...,sn)==[] <==> (s1==[] && ... && sn==[]) *) + F.p_all p_is_nil es + | L.Fun(elt,[_]) when elt == f_elt -> F.p_false (* [x]==[] <==> false *) + | L.Fun(repeat,[s;n]) when repeat == f_repeat -> + (* (s *^ n)==[] <==> (s==[] || n<=0) *) + F.p_or (F.p_leq n F.e_zero) (p_is_nil s) + | _ -> + raise Not_found + +(* Ensures xs to be a sub-sequence of ys, otherwise raise Not_found + In such a case, (concat xs = concat ys) <==> (forall r in result, r = nil) *) +let rec subsequence xs ys = + match xs , ys with + | [],ys -> ys + | x::rxs, y::rys -> + if (F.decide (e_eq x y)) then subsequence rxs rys else y :: subsequence xs rys | _ -> raise Not_found let elements a = match F.repr a with - | L.Fun( nil , [] ) when nil == f_nil -> [] - | L.Fun( concat , es ) when concat == f_concat -> es - | _ -> [a] - -(* [omit rs x ys]: if ys = u.x.v returns (rs+u,v) with r in reverse order *) - -let rec omit rs x = function - | [] -> raise Not_found - | y::ys -> if x == y then rs,ys else omit (y::rs) x ys - -let rec subsequence xs rs ys = - match xs with - | [] -> List.rev_append rs ys - | x::xs -> - let rs,ys = omit rs x ys in - subsequence xs rs ys + | L.Fun(concat,es) when concat == f_concat -> true, es + | _ -> false, [ a ] + +(* Ensures that [a] or [b] is a sub-sequence of the other, otherwise [raise Not_found] + In such a case, (concat xs = concat ys) <==> (forall r in result, r = nil) *) +let subsequence a b = + let destruct_a, xs = elements a in + let destruct_b, ys = elements b in + if not (destruct_a || destruct_b) then raise Not_found; + let shortest,xs,ys = if List.length xs <= List.length ys then a,xs,ys else b,ys,xs in + let es = subsequence xs ys in + (* xs=ys <==> forall s in es ; s = nil *) + let nil = v_nil (F.typeof shortest) in + (* [s] are elements of [ys] (the longest sequence) and [nil] has the same type than the [shortest] sequence *) + let p_is_nil s = F.p_equal nil s in + F.p_all p_is_nil es + +let repeat_eq a x n b y m = + let e_eq_x_y = F.e_eq x y in + let e_eq_n_m = F.e_eq n m in + if F.decide e_eq_x_y then + (* s *^ n == s *^ m <==> ( n=m || (s *^ n == [] && s *^ m == []) ) *) + let nil_a = v_nil (F.typeof a) in + let nil_b = v_nil (F.typeof b) in + F.p_or (Lang.F.p_bool e_eq_n_m) + (F.p_and (F.p_equal a nil_b) (F.p_equal nil_a b)) + else if F.decide e_eq_n_m then + (* x *^ n == y *^ n <==> ( x == y || n<=0 ) *) + F.p_or (F.p_leq n e_zero) (Lang.F.p_bool e_eq_x_y) + else if F.decide (e_eq (v_length x) (v_length y)) then + (* \length(x)=\length(y) ==> ( x *^ n == y *^ m <==> ( m == n && x == y) || (x *^ n == [] && y *^ m == [] ) *) + let nil_a = v_nil (F.typeof a) in + let nil_b = v_nil (F.typeof b) in + F.p_or (F.p_and (F.p_bool e_eq_n_m) (Lang.F.p_bool e_eq_x_y)) + (F.p_and (F.p_equal a nil_b) (F.p_equal nil_a b)) + else raise Not_found + +let rewrite_eq_sequence a b = + debug "Vlist.rewrite_eq_sequence: tries to rewrite %a@ = %a@.- left pattern: %a@.- right pattern: %a@." + Lang.F.pp_term a Lang.F.pp_term b + pp_pattern a pp_pattern b; + match F.repr a , F.repr b with + | L.Fun(nil,[]) , _ when nil == f_nil -> rewrite_is_nil ~nil:a b + | _ , L.Fun(nil,[]) when nil == f_nil -> rewrite_is_nil ~nil:b a + | _ -> try + match F.repr a , F.repr b with + | L.Fun(repeat_a, [x;n]), L.Fun(repeat_b, [y;m]) + when repeat_a == f_repeat && + repeat_b == f_repeat -> + repeat_eq a x n b y m + | _ -> + try leftmost_eq a b with Not_found -> + try rightmost_eq a b with Not_found -> + subsequence a b + with Not_found -> + if F.decide (F.e_neq (v_length a) (v_length b)) then + F.p_false + else raise Not_found + +let rewrite_eq_length a b = + match F.repr a , F.repr b with + | L.Fun(length_a,[_]), L.Fun(length_b,[_]) when length_a == f_length && + length_b == f_length -> + (* N.B. cannot be simplified by the next patterns *) + raise Not_found + | _, L.Fun(length,[_]) when length == f_length && + F.decide (e_lt a e_zero) -> + (* a < 0 ==> ( a=\length(b) <=> false ) *) + F.p_false + | L.Fun(length,[_]), _ when length == f_length && + F.decide (e_lt b e_zero) -> + (* b < 0 ==> ( \length(a)<=b <=> false ) *) + F.p_false + | _ -> raise Not_found -let rewrite_eq a b = +let rewrite_leq_length a b = match F.repr a , F.repr b with - | L.Fun(nil,[]) , _ when nil == f_nil -> rewrite_is_nil b - | _ , L.Fun(nil,[]) when nil == f_nil -> rewrite_is_nil a - | _ -> - try leftmost_eq a b with Not_found -> - try rightmost_eq a b with Not_found -> - let xs = elements a in - let ys = elements b in - if List.length xs < List.length ys - then F.p_all p_is_nil (subsequence xs [] ys) - else F.p_all p_is_nil (subsequence ys [] xs) + | L.Fun(length_a,[_]), L.Fun(length_b,[_]) when length_a == f_length && + length_b == f_length -> + (* N.B. cannot be simplified by the next patterns *) + raise Not_found + | L.Fun(length,[_]), _ when length == f_length && + F.decide (e_lt b e_zero) -> + (* b < 0 ==> ( \length(a)<=b <=> false ) *) + F.e_false + (* N.B. the next rule does not allow to split on the sign of \length(a) with TIP + | _, L.Fun(length,[_]) when length == f_length && + F.decide (e_leq a e_zero) -> + (* a <= 0 ==> ( a<=\length(b) <=> true ) *) + F.e_true + *) + | _ -> raise Not_found + (* All Simplifications *) @@ -275,8 +457,11 @@ let () = F.set_builtin_2' f_cons rewrite_cons ; F.set_builtin_2 f_repeat rewrite_repeat ; F.set_builtin_1 f_length rewrite_length ; - F.set_builtin_eqp f_repeat rewrite_eq ; - F.set_builtin_eqp f_nil rewrite_eq ; + F.set_builtin_leq f_length rewrite_leq_length ; + F.set_builtin_eqp f_length rewrite_eq_length ; + F.set_builtin_eqp f_concat rewrite_eq_sequence ; + F.set_builtin_eqp f_repeat rewrite_eq_sequence ; + F.set_builtin_eqp f_nil rewrite_eq_sequence ; end (* -------------------------------------------------------------------------- *) diff --git a/src/plugins/wp/cfgAnnot.ml b/src/plugins/wp/cfgAnnot.ml index 6e114cdf7e7e3c43ddc2711387d58f28241c2a5a..12bdacececdc8d4b81f3e63d20815cb4348c9357 100644 --- a/src/plugins/wp/cfgAnnot.ml +++ b/src/plugins/wp/cfgAnnot.ml @@ -244,11 +244,20 @@ let get_terminates_hyp kf = | Defined (_, p) -> false, p | Assumed p -> true, p +let check_variant_relation = function + | (_, None) -> () + | (_, Some rel) -> + Wp_parameters.hypothesis ~once:true + "'%a' relation must be well-founded" Cil_printer.pp_logic_info rel + let get_decreases_goal kf = let defined t = WpPropId.mk_decrease_id kf Kglobal t, t in match Annotations.decreases ~populate:false kf with | None -> None - | Some v -> Some (defined v) + | Some v -> check_variant_relation v ; Some (defined v) + +let get_decreases_hyp kf = + Annotations.decreases ~populate:false kf (* -------------------------------------------------------------------------- *) (* --- Contracts --- *) @@ -262,6 +271,7 @@ type contract = { contract_smoke : WpPropId.pred_info list ; contract_assigns : Cil_types.assigns ; contract_terminates : bool * Cil_types.predicate ; + contract_decreases : Cil_types.variant option ; } let assigns_upper_bound behaviors = @@ -338,6 +348,7 @@ module CallContract = WpContext.StaticGenerator(Kernel_function) | Writes froms -> Writes (normalize_froms Normal froms) in let terminates = get_terminates_hyp kf in + let decreases = get_decreases_hyp kf in { contract_cond = List.rev !wcond ; contract_hpre = List.rev !whpre ; @@ -346,6 +357,7 @@ module CallContract = WpContext.StaticGenerator(Kernel_function) contract_smoke = [] ; contract_assigns = assigns ; contract_terminates = terminates ; + contract_decreases = decreases ; } end) @@ -468,6 +480,15 @@ let mk_variant_properties kf s ca v = let vdecr = Logic_const.prel ~loc (Rlt, v, vcurr) in (vpos_id, vpos), (vdecr_id, vdecr) +let mk_variant_relation_property kf s ca v li = + check_variant_relation (v, Some li) ; + let vid = WpPropId.mk_var_id kf s ca in + let loc = v.term_loc in + let lcurr = Clabels.to_logic (Clabels.loop_current s) in + let vcurr = Logic_const.tat ~loc (v, lcurr) in + let variant = Logic_const.papp ~loc (li,[],[vcurr ; v]) in + (vid, variant) + type loop_hypothesis = | NoHyp | Check of WpPropId.prop_id @@ -505,6 +526,23 @@ module LoopContract = WpContext.StaticGenerator(CodeKey) let normalize_pred p = NormAtLabels.preproc_annot labels p in let normalize_annot (i,p) = i, normalize_pred p in let normalize_assigns w = NormAtLabels.preproc_assigns labels w in + let intro_terminates_variant ~loc (pid, v) = + pid, + let t = snd @@ get_terminates_hyp kf in + if Wp_parameters.TerminatesVariantHyp.get () then begin + if Logic_utils.is_same_predicate t Logic_const.pfalse then + Wp_parameters.warning + ~source:(fst loc) ~once:true + "Loop variant is always trivially verified \ + (terminates \\false)" ; + Logic_const.pimplies (t, v) + end else v + in + let variant_as_inv ~loc (i, p) = + let i, p = intro_terminates_variant ~loc @@ normalize_annot (i, p) in + { loop_pred = p ; + loop_hyp = NoHyp ; loop_est = None ; loop_ind = Some i } + in default_assigns stmt @@ Annotations.fold_code_annot begin fun _emitter ca l -> @@ -525,28 +563,15 @@ module LoopContract = WpContext.StaticGenerator(CodeKey) { l with loop_invariants = inv :: l.loop_invariants ; } | AVariant(term, None) -> - let vpos , vdec = - mk_variant_properties kf stmt ca term in - let intro_terminates (pid, v) = - pid, - let t = snd @@ get_terminates_hyp kf in - if Wp_parameters.TerminatesVariantHyp.get () then begin - if Logic_utils.is_same_predicate t Logic_const.pfalse then - Wp_parameters.warning - ~source:(fst term.term_loc) ~once:true - "Loop variant is always trivially verified \ - (terminates \\false)" ; - Logic_const.pimplies (t, v) - end else v - in - let mk_inv (i, p) = - let i, p = intro_terminates @@ normalize_annot (i, p) in - { loop_pred = p ; - loop_hyp = NoHyp ; loop_est = None ; loop_ind = Some i } - in + let vpos , vdec = mk_variant_properties kf stmt ca term in + let vpos = variant_as_inv ~loc:term.term_loc vpos in + let vdec = variant_as_inv ~loc:term.term_loc vdec in { l with loop_terminates = None ; - loop_invariants = - mk_inv vdec :: mk_inv vpos :: l.loop_invariants } + loop_invariants = vdec :: vpos :: l.loop_invariants } + | AVariant(term, Some rel) -> + let vrel = mk_variant_relation_property kf stmt ca term rel in + let vrel = variant_as_inv ~loc:term.term_loc vrel in + { l with loop_invariants = vrel :: l.loop_invariants } | AAssigns(_,WritesAny) -> let asgn = WpPropId.mk_loop_any_assigns_info stmt in { l with loop_assigns = asgn :: l.loop_assigns } diff --git a/src/plugins/wp/cfgAnnot.mli b/src/plugins/wp/cfgAnnot.mli index 53c1c4659e4eee89d24c38360ef7b054af202a9d..adfbe70680a6c211384c0e3d799a2ac57b478dba 100644 --- a/src/plugins/wp/cfgAnnot.mli +++ b/src/plugins/wp/cfgAnnot.mli @@ -118,6 +118,7 @@ type contract = { contract_smoke : pred_info list ; contract_assigns : assigns ; contract_terminates : bool * predicate ; (* boolean: assumed terminates *) + contract_decreases : variant option ; } val get_call_contract : ?smoking:stmt -> kernel_function -> stmt -> contract diff --git a/src/plugins/wp/cfgCalculus.ml b/src/plugins/wp/cfgCalculus.ml index 4fba7b07405c29adbe274cefd5e4695299d724c2..c7a4a5d656b4f2e1dc93e8e75671ae3035fd1cbe 100644 --- a/src/plugins/wp/cfgCalculus.ml +++ b/src/plugins/wp/cfgCalculus.ml @@ -188,7 +188,7 @@ struct let prove_property env (p : WpPropId.pred_info) w = if is_selected ~goal:true env p then W.add_goal env.we p w else w - let prove_subproperty env (p : WpPropId.pred_info) ?deps prop stmt source w = + let prove_subproperty env p ?deps prop stmt source w = if is_selected ~goal:true env p then W.add_subgoal env.we ?deps p prop stmt source w else w @@ -367,15 +367,31 @@ struct W.call_goal_precond env.we s kf es ~pre w_call else w_call in - match env.terminates with - | Some p when is_default_bhv env.mode && is_selected ~goal:true env p -> - let generated, callee_t = c.contract_terminates in - if generated then - Wp_parameters.warning ~once:true - "Missing terminates clause on call to %a, defaults to %a" - Kernel_function.pretty kf Cil_printer.pp_predicate callee_t ; - W.call_terminates env.we p s kf es ~callee_t w_pre - | _ -> w_pre + let callee_t = + (** TODO when kernel terminates complete: remove this code. *) + let generated, callee_t = c.contract_terminates in + if generated && env.terminates <> None then + Wp_parameters.warning ~once:true + "Missing terminates clause on call to %a, defaults to %a" + Kernel_function.pretty kf Cil_printer.pp_predicate callee_t ; + Some callee_t + in + let selected t = is_selected ~goal:true env t && is_default_bhv env.mode in + let in_cluster = CfgInfos.in_cluster ~caller:env.mode.kf kf in + let w_term = match env.terminates with + | Some t when selected t -> + W.call_terminates env.we s kf es t ?callee_t w_pre + | _ -> w_pre + in + let w_decr = match env.decreases with + | Some d when selected d && in_cluster -> + W.call_decreases env.we s kf es d + ?caller_t:(Option.map snd env.terminates) + ?callee_d:c.contract_decreases + w_term + | _ -> w_term + in + w_decr let do_complete_disjoint env w = if not (is_default_bhv env.mode) then w diff --git a/src/plugins/wp/cfgDump.ml b/src/plugins/wp/cfgDump.ml index c38b30c4127d6bf3949afa58487cfdeaaab2c9c4..6b348971f63e6ac6627e1b827337de79d0c9fc12 100644 --- a/src/plugins/wp/cfgDump.ml +++ b/src/plugins/wp/cfgDump.ml @@ -111,13 +111,12 @@ let add_goal env (pid,pred) k = Format.fprintf !out " %a -> %a [ style=dotted ] ;@." pretty u pretty k ; merge env u k -let add_subgoal env (pid, t_pred) ?deps prop stmt _source k = +let add_subgoal env (pid, _) ?deps prop stmt _source k = ignore deps ; let u = node () in if Wp_parameters.debug_atleast 1 then - Format.fprintf !out " %a [ color=red , label=\"Prove %a @@ %a (%a)\" ] ;@." + Format.fprintf !out " %a [ color=red , label=\"Prove %a (%a)\" ] ;@." pretty u - Printer.pp_predicate t_pred Cil_printer.pp_stmt stmt Printer.pp_predicate prop else @@ -245,16 +244,49 @@ let call_goal_precond env _stmt kf _es ~pre k = Format.fprintf !out " %a -> %a [ style=dotted ] ;@." pretty u pretty k ; merge env u k -let call_terminates env (_gpid, prop) _stmt kf _es ~callee_t k = - let _ = callee_t in +let call_terminates env _stmt kf _es (_gpid, prop) ?callee_t k = let u = node () in - Format.fprintf !out " %a [ color=red , label=\"Prove PreCond %a%t\" ] ;@." + let pp_opt_pred = Pretty_utils.pp_opt ~none:"FALSE" Printer.pp_predicate in + Format.fprintf !out " %a [ color=red , label=\"Prove Terminates %a%t\" ] ;@." pretty u Kernel_function.pretty kf begin fun fmt -> if Wp_parameters.debug_atleast 1 then Format.fprintf fmt "\n@[<hov 2>Terminates if %a[%s] ==> %a[%a];@]" Printer.pp_predicate prop "Caller" - Printer.pp_predicate callee_t Kernel_function.pretty kf + pp_opt_pred callee_t + Kernel_function.pretty kf + end ; + Format.fprintf !out " %a -> %a [ style=dotted ] ;@." pretty u pretty k ; + merge env u k + +let call_decreases env _s kf _es (_id, (caller_d, rel)) ?caller_t ?callee_d k = + let u = node () in + let pp_opt_pred = Pretty_utils.pp_opt ~none:"TRUE" Printer.pp_predicate in + let pp_rel fmt callee_d = + match rel with + | None -> + Format.fprintf fmt "%a ==> %a[%a] < %a[%s] && %a[%a] >= 0" + pp_opt_pred caller_t + Printer.pp_term callee_d Kernel_function.pretty kf + Printer.pp_term caller_d "Caller" + Printer.pp_term callee_d Kernel_function.pretty kf + | Some rel -> + Format.fprintf fmt "%a ==> %a(%a[%s], %a[%a])" + pp_opt_pred caller_t + Printer.pp_logic_info rel + Printer.pp_term caller_d "Caller" + Printer.pp_term callee_d Kernel_function.pretty kf + in + Format.fprintf !out " %a [ color=red , label=\"Prove Decreases %a%t\" ] ;@." + pretty u Kernel_function.pretty kf + begin fun fmt -> + match callee_d with + | None -> + Format.fprintf fmt "\n@[<hov 2>Decreases if %a ==> FALSE;@]" + pp_opt_pred caller_t + | Some (callee_d, _) -> + if Wp_parameters.debug_atleast 1 then + Format.fprintf fmt "\n@[<hov 2>Decreases if %a;@]" pp_rel callee_d end ; Format.fprintf !out " %a -> %a [ style=dotted ] ;@." pretty u pretty k ; merge env u k diff --git a/src/plugins/wp/cfgInfos.ml b/src/plugins/wp/cfgInfos.ml index c3fa404c7e5b3c500ed9b1893c1f0c304c660950..fb4d49fc6e481c6cfbcf41ad6aa1915b6e587180 100644 --- a/src/plugins/wp/cfgInfos.ml +++ b/src/plugins/wp/cfgInfos.ml @@ -208,7 +208,7 @@ module Callees = WpContext.StaticGenerator(Kernel_function) module RecursiveClusters : sig val is_recursive : Kernel_function.t -> bool - val get_cluster : Kernel_function.t -> Kernel_function.Set.t option + val in_cluster : caller:Kernel_function.t -> Kernel_function.t -> bool end = struct (* Tarjan's algorithm, adapted from: @@ -287,10 +287,15 @@ struct let is_recursive kf = (* in a recursive cluster or contains unspecified function pointer call *) None <> get_cluster kf || [] <> snd @@ Callees.get kf + + let in_cluster ~caller callee = + match get_cluster caller with + | None -> false + | Some cluster -> Fset.mem callee cluster end let is_recursive = RecursiveClusters.is_recursive -let get_cluster = RecursiveClusters.get_cluster +let in_cluster = RecursiveClusters.in_cluster (* -------------------------------------------------------------------------- *) (* --- No variant loops --- *) @@ -433,11 +438,8 @@ let compile Key.{ kf ; smoking ; bhv ; prop } = Option.iter begin fun (cfg : Cfg.automaton) -> (* Spec Iteration *) - if selected_decreases ~prop kf then - Wp_parameters.warning - "Unsupported clause @decreases in '%a' (ignored)" - Kernel_function.pretty kf ; - if selected_terminates ~prop kf || + if selected_decreases ~prop kf || + selected_terminates ~prop kf || selected_disjoint_complete kf ~bhv ~prop || (List.exists (selected_bhv ~smoking ~bhv ~prop) behaviors) then infos.annots <- true ; diff --git a/src/plugins/wp/cfgInfos.mli b/src/plugins/wp/cfgInfos.mli index ba6256d0099a60679a4f083661cdab56fc8b4761..b3daaf0164e7fc9fc2cb231930df62e82aada1b2 100644 --- a/src/plugins/wp/cfgInfos.mli +++ b/src/plugins/wp/cfgInfos.mli @@ -41,7 +41,7 @@ val unreachable : t -> Cfg.vertex -> bool val terminates_deps : t -> Property.Set.t val is_recursive : Kernel_function.t -> bool -val get_cluster : Kernel_function.t -> Kernel_function.Set.t option +val in_cluster : caller:Kernel_function.t -> Kernel_function.t -> bool val trivial_terminates : int ref diff --git a/src/plugins/wp/cfgInit.ml b/src/plugins/wp/cfgInit.ml index eba644dc7dd4d1fa48b39b5c04e5254444fc64ae..414da17ebf2cd686f8fc16bd2b9d48581949d42b 100644 --- a/src/plugins/wp/cfgInit.ml +++ b/src/plugins/wp/cfgInit.ml @@ -26,22 +26,22 @@ module Make(W : Mcfg.S) = struct let compute_global_init wenv filter obj = - Globals.Vars.fold_in_file_order + Globals.Vars.fold_in_file_rev_order (fun var initinfo obj -> + if var.vstorage = Extern then obj else let do_init = match filter with | `All -> true | `InitConst -> Cil.isGlobalInitConst var in if not do_init then obj - else - let old_loc = Cil.CurrentLoc.get () in + else let old_loc = Cil.CurrentLoc.get () in Cil.CurrentLoc.set var.vdecl ; let obj = W.init wenv var initinfo.init obj in Cil.CurrentLoc.set old_loc ; obj ) obj let process_global_const wenv obj = - Globals.Vars.fold_in_file_order + Globals.Vars.fold_in_file_rev_order (fun var _initinfo obj -> if Cil.isGlobalInitConst var then W.const wenv var obj diff --git a/src/plugins/wp/cfgWP.ml b/src/plugins/wp/cfgWP.ml index 97c136c1d4f285c2cc0117b7d9dd115951496e90..2ce1303333b56c06b634c2717998687d367e9361 100644 --- a/src/plugins/wp/cfgWP.ml +++ b/src/plugins/wp/cfgWP.ml @@ -1054,47 +1054,137 @@ struct (* --- WP RULE : call terminates --- *) (* -------------------------------------------------------------------------- *) - let call_terminates wenv (gpid, caller_t) stmt kf es ~callee_t wp = + let call_terminates wenv stmt kf args (id, caller_t) ?callee_t wp = in_wenv wenv wp (fun env wp -> - let gid = Gsource(gpid, stmt, FromCall) in let outcome = Warning.catch - ~severe:true ~effect:"Can not prove call termination" + ~severe:true + ~effect:"Considering that call must always terminate" (L.pred `Positive env) caller_t in + let warn, caller_t = match outcome with + | Warning.Failed warn -> warn, p_true + | Warning.Result (warn, p) -> warn, p + in + let prove_terminates ~warn p = + add_vc (Gsource(id, stmt, FromCall)) ~warn (p_imply caller_t p) + in + let sigma = L.current env in + let outcome = Warning.catch + ~severe:true + ~effect:"Considering non terminating callee" + (List.map (C.exp sigma)) args in match outcome with - | Warning.Failed warn -> - let vcs = add_vc gid ~warn p_false wp.vcs in + | Warning.Failed warn2 -> + let warn = W.union warn warn2 in + let vcs = prove_terminates ~warn p_false wp.vcs in + { wp with vcs = vcs } + | Warning.Result(warn2, args) -> + let warn = W.union warn warn2 in + let compile_callee = function + | None -> + Warning.error "No terminates clause for %a" + Kernel_function.pretty kf + | Some callee_t -> + let init = L.mem_at env Clabels.init in + let call = L.call kf args in + let call_e = L.mk_env ~here:sigma () in + let call_f = L.call_pre init call sigma in + L.in_frame call_f (L.pred `Positive call_e) callee_t + in + let outcome = + Warning.catch + ~severe:true ~effect:"Considering non terminating callee" + compile_callee callee_t + in + let warn2, callee_t = match outcome with + | Warning.Failed warn -> warn, p_false + | Warning.Result(warn,callee_t) -> warn, callee_t + in + let warn = W.union warn warn2 in + let vcs = prove_terminates ~warn callee_t wp.vcs in + { wp with vcs = vcs }) + + (* -------------------------------------------------------------------------- *) + (* --- WP RULE : call decreases --- *) + (* -------------------------------------------------------------------------- *) + + let call_decreases wenv stmt kf args (id, caller_d) ?caller_t ?callee_d wp = + in_wenv wenv wp + (fun env wp -> + let compile_caller_t caller_t = + if not @@ Wp_parameters.TerminatesVariantHyp.get () then p_true + else match caller_t with + | None -> p_true + | Some t -> (L.pred `Positive env) t + in + let outcome = Warning.catch + ~severe:true + ~effect:"Considering that call must always decrease" + compile_caller_t caller_t + in + let warn, caller_t = match outcome with + | Warning.Failed warn -> warn, p_true + | Warning.Result (warn, p) -> warn, p + in + let prove_decreases ~warn p = + add_vc (Gsource(id, stmt, FromCall)) ~warn (p_imply caller_t p) + in + let sigma = L.current env in + let outcome = Warning.catch + ~severe:true + ~effect:"Considering non decreasing call" + (List.map (C.exp sigma)) args in + match outcome with + | Warning.Failed warn2 -> + let warn = W.union warn warn2 in + let vcs = prove_decreases ~warn p_false wp.vcs in { wp with vcs = vcs } - | Warning.Result(warn, caller_t) -> - let sigma = L.current env in - let outcome = Warning.catch - ~severe:true ~effect:"Can not prove call preconditions" - (List.map (C.exp sigma)) es in - match outcome with - | Warning.Failed warn2 -> - let warn = W.union warn warn2 in - let vcs = add_vc gid ~warn p_false wp.vcs in - { wp with vcs = vcs } - | Warning.Result(warn2, vs) -> - let warn = W.union warn warn2 in - let init = L.mem_at env Clabels.init in - let call = L.call kf vs in - let call_e = L.mk_env ~here:sigma () in - let call_f = L.call_pre init call sigma in - let outcome = Warning.catch - ~severe:true ~effect:"Can not prove call precondition" - (L.in_frame call_f (L.pred `Positive call_e)) callee_t in - match outcome with - | Warning.Result(warn3,callee_t) -> - let warn = W.union warn warn3 in - let goal = p_imply caller_t callee_t in - let vcs = add_vc gid ~warn goal wp.vcs in - { wp with vcs = vcs } - | Warning.Failed warn3 -> - let warn = W.union warn warn3 in - let vcs = add_vc gid ~warn p_false wp.vcs in - { wp with vcs = vcs }) + | Warning.Result(warn2, args) -> + let warn = W.union warn warn2 in + let init = L.mem_at env Clabels.init in + let call = L.call kf args in + let call_e = L.mk_env ~here:sigma () in + let call_f = L.call_pre init call sigma in + let compile_decreases (caller_d, callee_d) = + match caller_d, callee_d with + | _, None -> + Warning.error "No decreases clause for %a" + Kernel_function.pretty kf + | (_, r), Some (_, r') + when not @@ Option.equal Logic_utils.is_same_logic_info r r' -> + let none : Pretty_utils.sformat = "<None>" in + Warning.error + "On call to %a, relation (%a) does not match caller (%a)" + Kernel_function.pretty kf + (Pretty_utils.pp_opt ~none Cil_printer.pp_logic_info) r + (Pretty_utils.pp_opt ~none Cil_printer.pp_logic_info) r' + | (caller_d, rel), Some (callee_d,_ ) -> + let rel caller callee = match rel with + | None -> + p_and (p_leq e_zero callee) (p_lt callee caller) + | Some rel -> + (L.in_frame call_f (L.call_pred call_e)) + rel [] [caller ; callee] + in + let caller_d = L.term env caller_d in + let callee_d = + (L.in_frame call_f (L.term call_e)) callee_d in + rel caller_d callee_d + in + let outcome = + Warning.catch + ~severe:true ~effect:"Considering non decreasing call" + compile_decreases (caller_d, callee_d) + in + let warn2, pred = match outcome with + | Warning.Failed warn -> warn, p_false + | Warning.Result (warn, p) -> warn, p + in + let warn = W.union warn warn2 in + let vcs = prove_decreases ~warn pred wp.vcs in + { wp with vcs = vcs }) + (* -------------------------------------------------------------------------- *) (* --- WP RULE : call postcondition --- *) @@ -1408,7 +1498,6 @@ struct po_pid = pid ; po_sid = "" ; po_gid = "" ; - po_leg = "" ; po_name = "" ; po_idx = index ; po_formula = GoalAnnot vcq ; @@ -1467,12 +1556,10 @@ struct WpPropId.split_bag begin fun po_pid wpo -> let po_sid = WpPropId.get_propid po_pid in - let po_leg = WpPropId.get_legacy po_pid in let po_gid = Printf.sprintf "%s_%s" mid po_sid in - let po_leg = Printf.sprintf "%s_%s" mid po_leg in let po_name = Pretty_utils.to_string WpPropId.pretty_local pid in let wpo = - { wpo with po_pid ; po_sid ; po_gid ; po_leg ; po_name } + { wpo with po_pid ; po_sid ; po_gid ; po_name } in Wpo.add wpo ; collection := Bag.append !collection wpo ; @@ -1499,11 +1586,9 @@ struct | LogicUsage.Axiomatic a -> Wpo.Axiomatic (Some a.ax_name) in let mid = WpContext.MODEL.id model in let sid = WpPropId.get_propid id in - let leg = WpPropId.get_legacy id in let wpo = { Wpo.po_model = model ; Wpo.po_gid = Printf.sprintf "%s_%s" mid sid ; - Wpo.po_leg = Printf.sprintf "%s_%s" mid leg ; Wpo.po_sid = sid ; Wpo.po_name = Printf.sprintf "Lemma '%s'" l.lem_name ; Wpo.po_idx = index ; diff --git a/src/plugins/wp/configure.ac b/src/plugins/wp/configure.ac index bfda65f8de4803c7a6e21af047d8a7d5005437f2..2063cb8fbb8dbf0b5519c4a006c93723b740e094 100644 --- a/src/plugins/wp/configure.ac +++ b/src/plugins/wp/configure.ac @@ -35,13 +35,6 @@ m4_ifndef([FRAMAC_M4_MACROS], check_plugin(wp,PLUGIN_RELATIVE_PATH(plugin_file),[WP plug-in],yes,yes) -AC_ARG_ENABLE( - wp-coq, - [ --enable-wp-coq Wp precompiled Coq libraries (default: yes)], - WPCOQ=$enableval, - WPCOQ=yes -) - plugin_require(wp,qed) plugin_require(wp,rtegen) plugin_use(wp,gui) @@ -76,29 +69,4 @@ case $WHY3VERSION in esac fi -# Nb: this would deserve to use plugin_requires mechanism -if test "$ENABLE_WP" != "no"; then - - ## Configuring for WP-COQ - if test "$WPCOQ" = "yes" ; then - AC_CHECK_PROG(COQC,coqc,yes,no) - if test "$COQC" = "yes" ; then - COQVERSION=`coqc -v | sed -n -e 's|.*version* *\([[^ ]]*\) .*$|\1|p' ` - case $COQVERSION in - 8.13.*|trunk) - AC_MSG_RESULT(coqc version $COQVERSION found) - ;; - *) - AC_MSG_RESULT(unsupported coqc version $COQVERSION for - deprecated - native backend) - COQC="no" - ;; - esac - fi - else - COQC="no" - fi - AC_SUBST(COQC) - -fi - write_plugin_config(Makefile) diff --git a/src/plugins/wp/doc/manual/wp_builtins.tex b/src/plugins/wp/doc/manual/wp_builtins.tex index c5df277c89c59b1a6e60f9227438a53b73e72689..4454601c8d3cd38a8eb861d195ac1ba37a7ac09b 100644 --- a/src/plugins/wp/doc/manual/wp_builtins.tex +++ b/src/plugins/wp/doc/manual/wp_builtins.tex @@ -141,7 +141,7 @@ Moreover, the following lemmas are added to complement the reference ones: \vskip 1em \hrule \label{builtin-exp-log} -\paragraph{$\builtin{exp}(x)$, $\builtin{log}(x)$ and $\builtin{log10}(x)$} are declared +\paragraph{$\builtin{exp}(x)$, $\builtin{log}(x)$ and $\builtin{log10}(x)$} are declared to be injective, monotonically increasing and are associated with the following simplifiers: \[ \begin{array}{rcl@{\quad}l} @@ -188,14 +188,14 @@ imported from \textsf{Why-3}. \vskip 1em \hrule \label{builtin-trigo} -\paragraph{$\builtin{sin}(x)$, $\builtin{cos}(x)$ and $\builtin{tan}(x)$} trigonometric +\paragraph{$\builtin{sin}(x)$, $\builtin{cos}(x)$ and $\builtin{tan}(x)$} trigonometric operations. Useful lemmas are already defined in the reference implementation from \textsf{Why-3} library. \label{builtin-arctrigo} -\paragraph{$\builtin{asin}(x)$, $\builtin{acos}(x)$ and $\builtin{atan}(x)$} trigonometric +\paragraph{$\builtin{asin}(x)$, $\builtin{acos}(x)$ and $\builtin{atan}(x)$} trigonometric operations. Except definition of $\builtin{atan}$ which is available from reference, -definition for arc-$\builtin{sin}$ and arc-$\builtin{cos}$ have been added. Moreover, +definition for arc-$\builtin{sin}$ and arc-$\builtin{cos}$ have been added. Moreover, all the arc-trigonometric operations are declared to be injective. In addition, the following simplifiers are also registered: @@ -216,7 +216,7 @@ and are actually provided by custom extensions installed in the \textsf{WP} shar \vskip 1em \hrule \label{builtin-hyperbolic} -\paragraph{$\builtin{sinh}(x)$, $\builtin{cosh}(x)$ and $\builtin{tanh}(x)$} trigonometric +\paragraph{$\builtin{sinh}(x)$, $\builtin{cosh}(x)$ and $\builtin{tanh}(x)$} trigonometric operations. Useful lemmas are already defined in the reference implementation from \textsf{Why-3} library. @@ -256,21 +256,21 @@ Since all the builtin symbols of \textsf{ACSL} are actually linked to the standa of \textsf{Why-3}, any user theory also referring to the standard symbols can be added to the proof environment by using option \verb+-wp-why-lib 'file...'+. -Otherwise, a driver shall be written. For instance, the additional lemma regarding $\builtin{exp}$ -p.\pageref{builtin-hyperbolic} for \textsf{Alt-Ergo} is simply defined in the following way: +Otherwise, a driver can be written. For instance, the additional lemma regarding $\builtin{exp}$ +p.\pageref{builtin-hyperbolic} for \textsf{Why3} is simply defined in the following way: -\begin{logs} +\begin{logs} // MyExp.mlw file - axiom exp_pos : (forall x:real. (0.0 < exp(x))) + axiom exp_pos : forall x:real. (0.0 < exp(x)) \end{logs} -Of course, this piece of \textsf{Alt-Ergo} input file must be integrated after the symbol +Of course, this piece of \textsf{Why3} input file must be integrated after the symbol \verb+exp+ has been defined. The corresponding driver is then: \begin{logs} // MyExp.driver file library exponential: - ergo.file += "MyExp.mlw" ; + why3.file += "MyExp.mlw" ; \end{logs} Such a driver, once loaded with option \verb+-wp-driver+, instructs \textsf{Frama-C/WP} to @@ -278,5 +278,5 @@ append your extension file to the other necessary resources for library \verb+"e which the logic ACSL builtin \verb+\exp+ belongs to. The file \verb+share/wp/wp.driver+ located into the shared directory of \textsf{Frama-C}, -and the associated files in sub-directories \verb+share/wp/ergo+ and \verb+share/wp/why3+ shall provide +and the associated files in sub-directory \verb+share/wp/why3+ shall provide all the necessary hints for extending the capabilities of \textsf{Frama-C/WP} in a similar way. diff --git a/src/plugins/wp/doc/manual/wp_intro.tex b/src/plugins/wp/doc/manual/wp_intro.tex index efc03f16a64a99fd858c7f1e6ffc99274ad4c4b2..114c37f60c44fdb305a6593938347fb4a2ad29ad 100644 --- a/src/plugins/wp/doc/manual/wp_intro.tex +++ b/src/plugins/wp/doc/manual/wp_intro.tex @@ -198,10 +198,13 @@ speaking, the \emph{weakest precondition} of property $Q$ through statement $\mathit{stmt}$ should also ensure termination and execution without runtime errors. -The proof obligations generated by \textsf{WP} do not entail -systematic termination, unless you systematically specify and validate -loop variant \textsf{ACSL} annotations. Nevertheless, \texttt{exit} behaviors of a -function are correctly handled by \textsf{WP}. +When the \verb+terminates+ clause is specified in function contracts, +\textsf{WP} generates proof +obligations to make sure that all loops have loop variants and that all function +calls terminate whenever necessary (thus requiring \verb+decreases+ clause for +recursive functions). Furthermore, \texttt{exit} behaviors of a function are +correctly handled by \textsf{WP}. More details about proof of termination in +\textsf{WP} are provided in Section~\ref{ss-sec:plugin-terminates}. Regarding runtime errors, the proof obligations generated by \textsf{WP} assume your program never raises any of them. As diff --git a/src/plugins/wp/doc/manual/wp_plugin.tex b/src/plugins/wp/doc/manual/wp_plugin.tex index c79c2da273021c4edd4880c5f0d4036010e71e3c..478cdf7d3982db2aeed329a47e9ab6f1fcb471f0 100644 --- a/src/plugins/wp/doc/manual/wp_plugin.tex +++ b/src/plugins/wp/doc/manual/wp_plugin.tex @@ -497,10 +497,29 @@ $G(n) \equiv P(n)\Longrightarrow\,Q(n)$: \Delta,\; \forall i,\, n < i \leq b \Longrightarrow G(i) \; & \models G(n) \end{array}} \] +\paragraph{Mod-Mask} Rewrite bitmask into/from modulo \\ +This tactic is used to rewrite a bitmask into a modulo (or a modulo into a +bitmask) when possible. The user selects an expression $e$ of the form +$b \% m$ (resp. $b \& m$ - $\texttt{land b m}$) than can be rewritten into +$b \& (m+1)$ (resp. $b \% (m - 1)$), if $0 \leq b$ and $m$ is a positive power +of 2 (resp. $m + 1$ is a positive power of 2). When selecting an expression +$x \& y$, both directions $x \% (y - 1)$ and $y \% (x - 1)$ can be considered. + +Since establishing that $m$ is a positive power of 2 can be hard, the tactic has +several behaviors. If \textsf{Qed} can prove immediately that an operand $m$ (or +$m+1$ for bitmaks) is a positive power of 2, the tactic only generates the guard +$0 \leq b$ and the rewritten goal. If it is not the case, the tactic appears +with the name ``Mod-Mask (hard)'' in the GUI. In this situation, the guard +consists of two conditions: $0 \leq b$ and $m$ (or $m+1$) is a positive power of +2. This guard involves an existential quantification, so it can be hard to +prove. When the selected term is a bitmask, the tactic cannot decide itself the +direction of the modulo, thus a checkbox is added in the configuration of the +tactic to select the direction of rewriting. + \paragraph{Overflow} Integer Conversions \\ This tactic split machine integer conversions into three cases: value in integer range, lower than range and upper than range. The tactic applies on expression -with pattern $\mathtt{to\_iota(e)}$ where \texttt{iota} is a a machine-integer +with pattern $\mathtt{to\_iota(e)}$ where \texttt{iota} is a machine-integer type name, \emph{eg.} \texttt{to\_uint32}. \[\TACTIC{\Delta\models G}{% @@ -1031,6 +1050,7 @@ a second for the call to \verb+f2+. A last goal is generated at the call site: one must prove that \verb+fp+ is either \verb+f1+ or \verb+f2+. \subsubsection{Proof of \texttt{@terminates}} +\label{ss-sec:plugin-terminates} In ACSL, a function can be specified to terminate when some condition \verb+P+ holds in pre-condition. @@ -1113,8 +1133,7 @@ as specified by the options: recursive cluster (as defined in the ACSL manual) and shall terminate, WP checks that a \verb+decreases+ clause is available for the function. Proving that existing recursive calls might be unreachable is delegated to the proof of the -\verb+decreases+ clause. Note however that, currenlty, the proof of \verb+decreases+ -clauses is not supported yet. +\verb+decreases+ clause. \paragraph{Function pointers. } On a call via a function pointer, WP checks that a \verb+@calls+ is specified for this function pointer. If so, WP just behaves diff --git a/src/plugins/wp/driver.mll b/src/plugins/wp/driver.mll index 8404774fb29a0c3eadcef27083ae3aeb8aa4f09d..e3eb5ad68cb42ae08809d2ca9578697a138c5fa0 100644 --- a/src/plugins/wp/driver.mll +++ b/src/plugins/wp/driver.mll @@ -81,10 +81,7 @@ | `Default -> conv_bal default (name,default) | `Left -> Qed.Engine.F_left name | `Right -> Qed.Engine.F_right name - | `Nary -> - if Qed.Plib.is_template name - then Qed.Engine.F_subst name - else Qed.Engine.F_call name + | `Nary -> Qed.Engine.F_call name } @@ -285,30 +282,24 @@ and bal = parse match token input with | LINK f | ID f -> let link = conv_bal def (f,(bal input.lexbuf)) in - skip input; Lang.infoprover link + skip input; link | RECLINK l -> skip input ; - begin try - {Lang.altergo = conv_bal def (List.assoc "altergo" l); - why3 = conv_bal def (List.assoc "why3" l); - coq = conv_bal def (List.assoc "coq" l) } + begin try conv_bal def (List.assoc "why3" l); with Not_found -> - failwith "a link must contain an entry for 'altergo', 'why3' and 'coq'" + failwith "a link must contain an entry for 'why3'" end | _ -> failwith "Missing link symbol" let linkstring input = match recorstring input.lexbuf with | `String f -> - skip input ; Lang.infoprover f + skip input ; f | `RecString l -> skip input ; - begin try - {Lang.altergo = List.assoc "altergo" l; - why3 = List.assoc "why3" l; - coq = List.assoc "coq" l } + begin try List.assoc "why3" l with Not_found -> - failwith "a link must contain an entry for 'altergo', 'why3' and 'coq'" + failwith "a link must contain an entry for 'why3'" end | _ -> failwith "Missing link symbol" diff --git a/src/plugins/wp/dune b/src/plugins/wp/dune index 2f2c3d8a3a6d4a7e6501fd3a3b63e63f930701a4..285ea8b2528adab0198b169b7a37a8580762f468 100644 --- a/src/plugins/wp/dune +++ b/src/plugins/wp/dune @@ -30,37 +30,6 @@ (files (share/Makefile.resources as wp/Makefile.resources) (share/install.ml as wp/install.ml) -(share/ergo/int.Abs.mlw as wp/ergo/int.Abs.mlw) -(share/ergo/Cint.mlw as wp/ergo/Cint.mlw) -(share/ergo/int.MinMax.mlw as wp/ergo/int.MinMax.mlw) -(share/ergo/real.Hyperbolic.mlw as wp/ergo/real.Hyperbolic.mlw) -(share/ergo/bool.Bool.mlw as wp/ergo/bool.Bool.mlw) -(share/ergo/real.Square.mlw as wp/ergo/real.Square.mlw) -(share/ergo/int.ComputerOfEuclideanDivision.mlw as wp/ergo/int.ComputerOfEuclideanDivision.mlw) -(share/ergo/ExpLog.mlw as wp/ergo/ExpLog.mlw) -(share/ergo/real.Real.mlw as wp/ergo/real.Real.mlw) -(share/ergo/Cbits.mlw as wp/ergo/Cbits.mlw) -(share/ergo/real.Trigonometry.mlw as wp/ergo/real.Trigonometry.mlw) -(share/ergo/int.Int.mlw as wp/ergo/int.Int.mlw) -(share/ergo/map.Const.mlw as wp/ergo/map.Const.mlw) -(share/ergo/Memory.mlw as wp/ergo/Memory.mlw) -(share/ergo/real.FromInt.mlw as wp/ergo/real.FromInt.mlw) -(share/ergo/int.ComputerDivision.mlw as wp/ergo/int.ComputerDivision.mlw) -(share/ergo/ArcTrigo.mlw as wp/ergo/ArcTrigo.mlw) -(share/ergo/real.Truncate.mlw as wp/ergo/real.Truncate.mlw) -(share/ergo/real.MinMax.mlw as wp/ergo/real.MinMax.mlw) -(share/ergo/Cfloat.mlw as wp/ergo/Cfloat.mlw) -(share/ergo/real.Polar.mlw as wp/ergo/real.Polar.mlw) -(share/ergo/real.PowerReal.mlw as wp/ergo/real.PowerReal.mlw) -(share/ergo/Square.mlw as wp/ergo/Square.mlw) -(share/ergo/map.Map.mlw as wp/ergo/map.Map.mlw) -(share/ergo/Vset.mlw as wp/ergo/Vset.mlw) -(share/ergo/real.RealInfix.mlw as wp/ergo/real.RealInfix.mlw) -(share/ergo/Vlist.mlw as wp/ergo/Vlist.mlw) -(share/ergo/real.Abs.mlw as wp/ergo/real.Abs.mlw) -(share/ergo/Cmath.mlw as wp/ergo/Cmath.mlw) -(share/ergo/Qed.mlw as wp/ergo/Qed.mlw) -(share/ergo/real.ExpLog.mlw as wp/ergo/real.ExpLog.mlw) (share/why3/frama_c_wp/vlist.mlw as wp/why3/frama_c_wp/vlist.mlw) (share/why3/frama_c_wp/cbits.mlw as wp/why3/frama_c_wp/cbits.mlw) (share/why3/frama_c_wp/cint.mlw as wp/why3/frama_c_wp/cint.mlw) @@ -69,42 +38,5 @@ (share/why3/frama_c_wp/memory.mlw as wp/why3/frama_c_wp/memory.mlw) (share/why3/frama_c_wp/cmath.mlw as wp/why3/frama_c_wp/cmath.mlw) (share/why3/frama_c_wp/cfloat.mlw as wp/why3/frama_c_wp/cfloat.mlw) -(share/coqwp/Cmath.v as wp/coqwp/Cmath.v) -(share/coqwp/Qedlib.v as wp/coqwp/Qedlib.v) -(share/coqwp/Memory.v as wp/coqwp/Memory.v) -(share/coqwp/map/Const.v as wp/coqwp/map/Const.v) -(share/coqwp/map/Map.v as wp/coqwp/map/Map.v) -(share/coqwp/HighOrd.v as wp/coqwp/HighOrd.v) -(share/coqwp/int/Abs.v as wp/coqwp/int/Abs.v) -(share/coqwp/int/Int.v as wp/coqwp/int/Int.v) -(share/coqwp/int/Exponentiation.v as wp/coqwp/int/Exponentiation.v) -(share/coqwp/int/Power.v as wp/coqwp/int/Power.v) -(share/coqwp/int/MinMax.v as wp/coqwp/int/MinMax.v) -(share/coqwp/int/ComputerOfEuclideanDivision.v as wp/coqwp/int/ComputerOfEuclideanDivision.v) -(share/coqwp/int/ComputerDivision.v as wp/coqwp/int/ComputerDivision.v) -(share/coqwp/int/EuclideanDivision.v as wp/coqwp/int/EuclideanDivision.v) -(share/coqwp/Cfloat.v as wp/coqwp/Cfloat.v) -(share/coqwp/bool/Bool.v as wp/coqwp/bool/Bool.v) -(share/coqwp/Qed.v as wp/coqwp/Qed.v) -(share/coqwp/Bits.v as wp/coqwp/Bits.v) -(share/coqwp/ExpLog.v as wp/coqwp/ExpLog.v) -(share/coqwp/Square.v as wp/coqwp/Square.v) -(share/coqwp/real/Abs.v as wp/coqwp/real/Abs.v) -(share/coqwp/real/Trigonometry.v as wp/coqwp/real/Trigonometry.v) -(share/coqwp/real/RealInfix.v as wp/coqwp/real/RealInfix.v) -(share/coqwp/real/MinMax.v as wp/coqwp/real/MinMax.v) -(share/coqwp/real/ExpLog.v as wp/coqwp/real/ExpLog.v) -(share/coqwp/real/Square.v as wp/coqwp/real/Square.v) -(share/coqwp/real/Real.v as wp/coqwp/real/Real.v) -(share/coqwp/real/PowerReal.v as wp/coqwp/real/PowerReal.v) -(share/coqwp/real/FromInt.v as wp/coqwp/real/FromInt.v) -(share/coqwp/Vset.v as wp/coqwp/Vset.v) -(share/coqwp/Vlist.v as wp/coqwp/Vlist.v) -(share/coqwp/Zbits.v as wp/coqwp/Zbits.v) -(share/coqwp/ArcTrigo.v as wp/coqwp/ArcTrigo.v) -(share/coqwp/Cint.v as wp/coqwp/Cint.v) -(share/coqwp/Cbits.v as wp/coqwp/Cbits.v) -(share/coqwp/BuiltIn.v as wp/coqwp/BuiltIn.v) (share/wp.driver as wp/wp.driver) -(share/Makefile.coqwp as wp/Makefile.coqwp) )) diff --git a/src/plugins/wp/gui/GuiGoal.ml b/src/plugins/wp/gui/GuiGoal.ml index 6fb5dd22d7e1c924a220c2556714929b4de685e4..c04201773562b945cbee00f0a703ec94995afe62 100644 --- a/src/plugins/wp/gui/GuiGoal.ml +++ b/src/plugins/wp/gui/GuiGoal.ml @@ -118,7 +118,6 @@ class pane (gprovers : GuiConfig.provers) = let iformat = new iformat in let rformat = new rformat in let strategies = new GuiTactic.strategies () in - let native = List.mem "native:alt-ergo" (Wp_parameters.Provers.get ()) in object(self) val mutable state : state = Empty @@ -140,15 +139,11 @@ class pane (gprovers : GuiConfig.provers) = Config.config_float ~key:"GuiGoal.palette" ~default:0.8 content ); layout#populate (Wbox.panel ~top:toolbar content#widget) ; - let native_ergo = - if native then [ - new GuiProver.prover ~console:text ~prover:VCS.NativeAltErgo - ] else [] in let why3_provers = List.map (fun dp -> new GuiProver.prover ~console:text ~prover:(VCS.Why3 dp)) (Why3.Whyconf.Sprover.elements gprovers#get) in - provers <- native_ergo @ why3_provers ; + provers <- why3_provers ; List.iter (fun p -> palette#add_tool p#tool) provers ; palette#add_tool strategies#tool ; Strategy.iter strategies#register ; @@ -275,7 +270,6 @@ class pane (gprovers : GuiConfig.provers) = autofocus#set mode ; self#update method private provers = - (if native then [ VCS.NativeAltErgo ] else []) @ (List.map (fun dp -> VCS.Why3 dp) (Why3.Whyconf.Sprover.elements gprovers#get)) @@ -547,17 +541,21 @@ class pane (gprovers : GuiConfig.provers) = begin fun () -> text#clear ; let main = ProofEngine.main proof in - if ProofSession.exists main then begin + if ProofSession.exists main then text#printf (if ProofEngine.saved proof then "%a (@{<green>saved@})@." else "%a (@{<orange>modified@})@.") + ProofSession.pp_script_for main + else + text#printf "%a (@{<blue>not created@})@." ProofSession.pp_script_for main ; - text#hrule ; - end ; + text#hrule ; scripter#tree proof ; text#hrule ; text#printf "%t@." (printer#goal (ProofEngine.head proof)) ; + text#printf "@{<bf>Goal id:@} %s@." main.po_gid ; + text#printf "@{<bf>Short id:@} %s@." main.po_sid ; text#hrule ; scripter#status proof ; end () diff --git a/src/plugins/wp/gui/GuiList.ml b/src/plugins/wp/gui/GuiList.ml index 5bd26da272aae9c91b796182fc56c58b73e91fb9..5db3d2b3246d8776a21304559f7179cd4032057b 100644 --- a/src/plugins/wp/gui/GuiList.ml +++ b/src/plugins/wp/gui/GuiList.ml @@ -151,11 +151,6 @@ class pane (gprovers:GuiConfig.provers) = List.iter self#create_prover [ VCS.Qed ; VCS.Tactical ] ; - let prv = Wp_parameters.Provers.get () in - if List.mem "native:alt-ergo" prv then - self#create_prover VCS.NativeAltErgo ; - if List.mem "native:coq" prv then - self#create_prover VCS.NativeCoq ; ignore (list#add_column_empty) ; list#set_selection_mode `MULTIPLE ; gprovers#connect self#configure ; diff --git a/src/plugins/wp/gui/GuiNavigator.ml b/src/plugins/wp/gui/GuiNavigator.ml index 49b85d6d68588a439e1069d0f4259f649f18e274..d92911dc44128a9145abc4e61097cc1aa67aeb5e 100644 --- a/src/plugins/wp/gui/GuiNavigator.ml +++ b/src/plugins/wp/gui/GuiNavigator.ml @@ -261,8 +261,6 @@ class behavior | _ -> let mode = match mode , prover with | Some m , _ -> m - | None , VCS.NativeCoq -> VCS.Edit - | None , VCS.NativeAltErgo -> VCS.Fix | _ -> if VCS.is_auto prover then VCS.Batch else VCS.Fix in schedule (Prover.prove w ~mode ~result prover) ; refresh w @@ -289,8 +287,6 @@ class behavior val popup_qed = new Widget.popup () val popup_tip = new Widget.popup () - val popup_ergo = new Widget.popup () - val popup_coq = new Widget.popup () val popup_why3_auto = new Widget.popup () val popup_why3_inter = new Widget.popup () val mutable popup_target = None @@ -332,10 +328,6 @@ class behavior popup_why3_inter#add_item ~label:"Check Script" ~callback:(self#popup_run VCS.Batch) ; popup_why3_inter#add_item ~label:"Edit Script" ~callback:(self#popup_run VCS.Edit) ; popup_why3_inter#add_item ~label:"Fixup Script" ~callback:(self#popup_run VCS.FixUpdate) ; - self#add_popup_proofmodes popup_ergo - [ "Run",Batch ; "Open Altgr-Ergo on Fail",Edit ; "Open Altgr-Ergo",Edit ] ; - self#add_popup_proofmodes popup_coq - [ "Check Proof",Batch ; "Edit on Fail",Edit ; "Edit Proof",Edit ] ; end method private popup w p = @@ -345,8 +337,6 @@ class behavior match p with | None | Some Tactical -> popup_tip#run () | Some Qed -> popup_qed#run () - | Some NativeCoq -> popup_coq#run () - | Some NativeAltErgo -> popup_ergo#run () | Some (Why3 _ as p) -> if VCS.is_auto p then popup_why3_auto#run () diff --git a/src/plugins/wp/gui/GuiProver.ml b/src/plugins/wp/gui/GuiProver.ml index 2105cb52f7956f16fab36c63e30a3c9c88599b01..2ff42a0eb2c54072ddc1ad675415a0d51e147003 100644 --- a/src/plugins/wp/gui/GuiProver.ml +++ b/src/plugins/wp/gui/GuiProver.ml @@ -27,15 +27,15 @@ let wg_status = `Share "theme/default/surely_invalid.png" let smoke_status = `Share "theme/default/valid_under_hyp.png" let filter = function - | VCS.Qed | VCS.Tactical | VCS.NativeCoq -> false - | VCS.Why3 _ | VCS.NativeAltErgo -> true + | VCS.Qed | VCS.Tactical -> false + | VCS.Why3 _ -> true (* -------------------------------------------------------------------------- *) (* --- Palette Tool --- *) (* -------------------------------------------------------------------------- *) let timeout_for = function - | VCS.NativeAltErgo | VCS.Why3 _ -> + | VCS.Why3 _ -> let value = Wp_parameters.Timeout.get () in let spin = new Widget.spinner ~tooltip:"Prover Timeout (0 for none)" @@ -44,7 +44,7 @@ let timeout_for = function | _ -> None let stepout_for = function - | VCS.NativeAltErgo -> + | VCS.Why3 _ -> let value = Wp_parameters.Steps.get () in let spin = new Widget.spinner ~tooltip:"Prover Step Limit (0 for none)" diff --git a/src/plugins/wp/gui/GuiSequent.ml b/src/plugins/wp/gui/GuiSequent.ml index fdb29988b39ecae1b81bc3f91b8cd17ccadb008c..aaf112abc48264d254f3062d2d58f0d3291732d8 100644 --- a/src/plugins/wp/gui/GuiSequent.ml +++ b/src/plugins/wp/gui/GuiSequent.ml @@ -623,7 +623,7 @@ class focused (wtext : Wtext.text) = method set_target tgt = match tgt with - | Tactical.Empty | Tactical.Compose _ -> + | Tactical.Empty | Tactical.Compose _ | Tactical.Multi _ -> begin pcond#set_target Term ; plang#clear_target ; diff --git a/src/plugins/wp/gui/GuiTactic.ml b/src/plugins/wp/gui/GuiTactic.ml index cd14d8126cfd5ca69012706ae4ba04ef3ff8c631..8484deedffa91668367340b37887826381e581a7 100644 --- a/src/plugins/wp/gui/GuiTactic.ml +++ b/src/plugins/wp/gui/GuiTactic.ml @@ -89,7 +89,7 @@ class checkbox begin Wutil.on enabled button#set_visible ; Wutil.on tooltip button#set_tooltip ; - ignore title ; + Wutil.on title button#set_label ; ignore filter ; ignore vmin ; ignore vmax ; diff --git a/src/plugins/wp/mcfg.ml b/src/plugins/wp/mcfg.ml index 3afad69feed2e4d4e6fcd96525a437f27dfd6306..881d303b667a1abad001661a268c50e40fbb6cab 100644 --- a/src/plugins/wp/mcfg.ml +++ b/src/plugins/wp/mcfg.ml @@ -68,7 +68,7 @@ module type S = sig val add_hyp : ?for_pid:WpPropId.prop_id -> t_env -> WpPropId.pred_info -> t_prop -> t_prop val add_goal : t_env -> WpPropId.pred_info -> t_prop -> t_prop - val add_subgoal : t_env -> WpPropId.pred_info -> ?deps:Property.Set.t -> + val add_subgoal : t_env -> WpPropId.prop_id * 'a -> ?deps:Property.Set.t -> predicate -> stmt -> WpPropId.effect_source -> t_prop -> t_prop val add_assigns : t_env -> WpPropId.assigns_info -> t_prop -> t_prop @@ -104,9 +104,15 @@ module type S = sig pre: WpPropId.pred_info list -> t_prop -> t_prop - val call_terminates : t_env -> WpPropId.pred_info -> - stmt -> kernel_function -> exp list -> - callee_t:predicate -> t_prop -> t_prop + val call_terminates : t_env -> stmt -> + kernel_function -> exp list -> + WpPropId.pred_info -> ?callee_t:predicate -> t_prop -> t_prop + + val call_decreases : t_env -> stmt -> + kernel_function -> exp list -> + WpPropId.variant_info -> + ?caller_t: predicate -> + ?callee_d: variant -> t_prop -> t_prop val call : t_env -> stmt -> lval option -> kernel_function -> exp list -> diff --git a/src/plugins/wp/proof.ml b/src/plugins/wp/proof.ml deleted file mode 100644 index f7f06f015649c990629434e477a44010da91ce76..0000000000000000000000000000000000000000 --- a/src/plugins/wp/proof.ml +++ /dev/null @@ -1,329 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* -------------------------------------------------------------------------- *) -(* --- Proof Script Database --- *) -(* -------------------------------------------------------------------------- *) - -let scriptbase : (string, string list * string * string) Hashtbl.t = Hashtbl.create 81 -(* [ goal name -> sorted hints , script , closing ] *) -let scriptfile = ref None (* current file script name *) -let needback = ref false (* file script need backup before modification *) -let needsave = ref false (* file script need to be saved *) -let needwarn = ref false (* user should be prompted for chosen scriptfile *) - -let sanitize hint = - try - let n = String.length hint in - if n <= 0 then raise Exit ; - for i = 0 to n - 1 do - match hint.[i] with - | 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '-' | '*' -> () - | _ -> raise Exit - done ; true - with Exit -> false - -let register_script goal hints proof closing = - let hints = List.sort String.compare (List.filter sanitize hints) in - Hashtbl.replace scriptbase goal (hints,proof,closing) - -let delete_script_for ~gid = - Hashtbl.remove scriptbase gid - -(* -------------------------------------------------------------------------- *) -(* --- Proof Scripts Parsers --- *) -(* -------------------------------------------------------------------------- *) - -open Script - -let is_empty_script script = - try - for i=0 to String.length script - 1 do - match script.[i] with '\n' | ' ' | '\t' -> () | _ -> raise Exit - done ; true - with Exit -> false - -let parse_coqproof file = - let input = Script.open_file file in - try - let rec fetch_proof input = - match token input with - | Proof(p,c) -> Some(p,c) - | Eof -> None - | _ -> skip input ; fetch_proof input - in - let proof = fetch_proof input in - Script.close input ; proof - with e -> - Script.close input ; - raise e - -let collect_scripts input = - while key input "Goal" do - let g = ident input in - eat input "." ; - let xs = - if key input "Hint" then - let xs = idents input in - eat input "." ; xs - else [] - in - let proof,qed = - match token input with - | Proof(p,c) -> skip input ; p,c - | _ -> error input "Missing proof" - in - register_script g xs proof qed - done ; - if token input <> Eof - then error input "Unexpected script declaration" - -let parse_scripts file = - if Sys.file_exists file then - begin - let input = Script.open_file file in - try - collect_scripts input ; - Script.close input ; - with e -> - Script.close input ; - raise e - end - -let dump_scripts file = - let out = open_out file in - let fmt = Format.formatter_of_out_channel out in - try - Format.fprintf fmt "(* Generated by Frama-C WP *)@\n@\n" ; - let goals = Hashtbl.fold (fun goal _ gs -> goal::gs) scriptbase [] in - List.iter - (fun goal -> - let (hints,proof,qed) = Hashtbl.find scriptbase goal in - Format.fprintf fmt "Goal %s.@\n" goal ; - (match hints with - | [] -> () - | k::ks -> - Format.fprintf fmt "Hint %s" k ; - List.iter (fun k -> Format.fprintf fmt ",%s" k) ks ; - Format.fprintf fmt ".@\n"); - Format.fprintf fmt "Proof.@\n%s%s@\n@." proof qed - ) (List.sort String.compare goals) ; - Format.pp_print_newline fmt () ; - close_out out ; - with e -> - Format.pp_print_newline fmt () ; - close_out out ; - raise e - -(* -------------------------------------------------------------------------- *) -(* --- Scripts Management --- *) -(* -------------------------------------------------------------------------- *) - -let rec choose k = - let file = Printf.sprintf "wp%d.script" k in - if Sys.file_exists file then choose (succ k) else file - -let savescripts () = - if !needsave then - match !scriptfile with - | None -> () - | Some file -> - if Wp_parameters.UpdateScript.get () then - try - if !needback then - ( Command.copy file (file ^ ".back") ; needback := false ) ; - if !needwarn then - ( needwarn := false ; - Wp_parameters.warning ~current:false - "No script file specified.@\n\ - Your proofs are saved in '%s'@\n\ - Use -wp-script '%s' to re-run them." - file file ; - ) ; - dump_scripts file ; - needsave := false ; - with e -> - Wp_parameters.abort - "Error when dumping script file '%s':@\n%s" file - (Printexc.to_string e) - else - Wp_parameters.warning ~once:true ~current:false - "Script base modified : modification will not be saved" - -let loadscripts () = - let user = Wp_parameters.Script.get () in - if !scriptfile <> Some user then - begin - savescripts () ; - begin - try parse_scripts user ; - with e -> - Wp_parameters.error - "Error in script file '%s':@\n%s" user - (Printexc.to_string e) - end ; - if Wp_parameters.UpdateScript.get () then - if user = "" then - (* update new file *) - begin - let ftmp = choose 0 in - Wp_parameters.Script.set ftmp ; - scriptfile := Some ftmp ; - needwarn := true ; - needback := false ; - end - else - (* update user's file *) - begin - scriptfile := Some user ; - needback := Sys.file_exists user ; - end - else - (* do not update *) - begin - scriptfile := Some user ; - needback := false ; - end - end - -let find_script_for_goal ~gid ~legacy = - loadscripts () ; - try - let _,proof,qed = Hashtbl.find scriptbase gid in - Some(proof,qed) - with Not_found -> - try - let (_,proof,qed) as entry = Hashtbl.find scriptbase legacy in - Wp_parameters.feedback "Upgrading Coq script for '%s'" gid ; - Hashtbl.add scriptbase gid entry ; - Hashtbl.remove scriptbase legacy ; - needsave := true ; - Some(proof,qed) - with Not_found -> - None - -let update_hints_for_goal goal hints = - try - let old_hints,script,qed = Hashtbl.find scriptbase goal in - let new_hints = List.sort String.compare hints in - if Stdlib.compare new_hints old_hints <> 0 then - begin - Hashtbl.replace scriptbase goal (new_hints,script,qed) ; - needsave := true ; - end - with Not_found -> () - - -let rec matches n xs ys = - match xs , ys with - | x::rxs , y::rys -> - let c = String.compare x y in - if c < 0 then matches n rxs ys else - if c > 0 then matches n xs rys else - matches (succ n) rxs rys - | _ -> n - -let rec filter xs ys = - match xs , ys with - | [] , _ -> ys - | _::_ , [] -> raise Not_found - | x::rxs , y::rys -> - let c = String.compare x y in - if c < 0 then raise Not_found else - if c > 0 then y :: filter xs rys else - filter rxs rys - -let most_suitable (n,_,_,_) (n',_,_,_) = n'-n - -let find_script_with_hints required hints = - loadscripts () ; - let required = List.sort String.compare required in - let hints = List.sort String.compare hints in - List.sort most_suitable - begin - Hashtbl.fold - (fun g (xs,proof,qed) scripts -> - try - let n = matches 0 hints (filter required xs) in - (n,g,proof,qed)::scripts - with Not_found -> scripts) - scriptbase [] - end - -let add_script_for ~gid hints proof = - needsave := true ; register_script gid hints proof - -(* -------------------------------------------------------------------------- *) -(* --- Prover API --- *) -(* -------------------------------------------------------------------------- *) - -let script_for ~pid ~gid ~legacy = - let found = find_script_for_goal ~gid ~legacy in - ( if found <> None then - let required,hints = WpPropId.prop_id_keys pid in - let all = List.merge String.compare required hints in - update_hints_for_goal gid all ) ; - found - -let rec head n = function [] -> [] - | x::xs -> if n > 0 then x :: head (pred n) xs else [] - -let hints_for ~pid = - let default = match Wp_parameters.CoqTactic.get () with - | "none" -> [] - | tactic -> ["Default tactic",Printf.sprintf " %s.\n" tactic,"Qed."] - in - if Wp_parameters.TryHints.get () then - let nhints = Wp_parameters.Hints.get () in - if nhints > 0 then - let required,hints = WpPropId.prop_id_keys pid in - let scripts = find_script_with_hints required hints in - default @ List.map (fun (_,_,s,q) -> "Hint",s,q) (head nhints scripts) - else default - else default - -let script_for_ide ~pid ~gid ~legacy = - match find_script_for_goal ~gid ~legacy with - | Some script -> script - | None -> - let required,hints = WpPropId.prop_id_keys pid in - let hints = find_script_with_hints required hints in - let script = - if hints = [] then - begin - match Wp_parameters.CoqTactic.get () with - | "none" -> "" - | tactic -> Format.asprintf "(* %s. *)\n" tactic - end - else - begin - let nhints = Wp_parameters.Hints.get () in - Format.asprintf "%t" - (fun fmt -> - List.iter - (fun (_,g,script,_) -> - Format.fprintf fmt - "(*@ --------------------------------------\n \ - @ From '%s': \n%s*)\n%!" g script - ) (head nhints hints)) - end - in script , "Qed." diff --git a/src/plugins/wp/prover.ml b/src/plugins/wp/prover.ml index addb11faabbe595cce13c1d13f83e4d1e996314e..4483cf24c32f0571871134cd696ecbded8eb93cb 100644 --- a/src/plugins/wp/prover.ml +++ b/src/plugins/wp/prover.ml @@ -33,8 +33,6 @@ let dispatch ?(config=VCS.default) mode prover wpo = begin match prover with | Qed | Tactical -> Task.return VCS.no_result - | NativeAltErgo -> ProverErgo.prove ~config ~mode wpo - | NativeCoq -> ProverCoq.prove mode wpo | Why3 prover -> let smoke = Wpo.is_smoke_test wpo in ProverWhy3.prove diff --git a/src/plugins/wp/share/Makefile.coqwp b/src/plugins/wp/share/Makefile.coqwp deleted file mode 100644 index 9bdd3d154b0096059f1d5a09c6a4877def52982a..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/Makefile.coqwp +++ /dev/null @@ -1,87 +0,0 @@ -########################################################################## -# # -# This file is part of WP plug-in of Frama-C. # -# # -# Copyright (C) 2007-2021 # -# CEA (Commissariat a l'energie atomique et aux energies # -# alternatives) # -# # -# you can redistribute it and/or modify it under the terms of the GNU # -# Lesser General Public License as published by the Free Software # -# Foundation, version 2.1. # -# # -# It is distributed in the hope that it will be useful, # -# but WITHOUT ANY WARRANTY; without even the implied warranty of # -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # -# GNU Lesser General Public License for more details. # -# # -# See the GNU Lesser General Public License version 2.1 # -# for more details (enclosed in the file licenses/LGPLv2.1). # -# # -########################################################################## - - -WPLSHARE=$(Wp_DIR)/share - -# -------------------------------------------------------------------------- -# --- Coq Compilation -# -------------------------------------------------------------------------- - -.PHONY: coqwpcompile - -COQWPINCLUDES= -R $(WPLSHARE)/coqwp '' -COQWPBINARIES= $(addprefix $(WPLSHARE)/, $(ALL_COQ_BINARIES)) - -coqwpcompile: $(COQWPBINARIES) - -$(WPLSHARE)/coqwp/%.vo: $(WPLSHARE)/coqwp/%.v - echo "Coqc $<" - coqc -w none $(COQWPINCLUDES) $< - -$(WPLSHARE)/coqwp/%.ide: $(WPLSHARE)/coqwp/%.v - echo "Coqide $<" - coqide $(COQWPINCLUDES) $< - -$(WPLSHARE)/coqwp/.depend: $(addprefix $(WPLSHARE)/, $(WP_COQ_SOURCES)) - echo "Coqdep $(WPLSHARE)/coqwp" - @coqdep $(COQWPINCLUDES) $(WPLSHARE)/coqwp/*.v $(WPLSHARE)/coqwp/**/*.v > $@ - -# -------------------------------------------------------------------------- -# --- Additional Targets -# -------------------------------------------------------------------------- - -.PHONY: wp-coq-compile wp-coq-clean wp-coq-install wp-coq-uninstall - -wp-coq-compile: coqwpcompile - @echo "Run 'make wp-coq-install' to install all precompiled libraries" - -wp-coq-clean: - find $(Wp_DIR) \( -name "*.vo" -or -name "*.glob" -or -name ".*.aux" \) -delete - rm -f $(WPLSHARE)/coqwp/.depend - -wp-coq-install: - $(PRINT_INSTALL) "Coq Libraries" - $(INSTALL_SHARE) -f -p -s \ - -i $(Wp_DIR)/share \ - -d $(FRAMAC_DATADIR)/wp \ - $(ALL_COQ_BINARIES) - -wp-coq-uninstall: - $(PRINT_RM) "Coq Libraries" - @rm -f $(FRAMAC_DATADIR)/wp/why3/*.vo - @rm -f $(FRAMAC_DATADIR)/wp/coqwp/*.vo - @rm -f $(FRAMAC_DATADIR)/wp/coqwp/*/*.vo - -# -------------------------------------------------------------------------- -# --- Coq Dependencies -# -------------------------------------------------------------------------- - -ifneq ($(MAKECMDGOALS),clean) -ifneq ($(MAKECMDGOALS),distclean) -ifneq ($(MAKECMDGOALS),smartclean) -sinclude $(WPLSHARE)/coqwp/.depend -endif -endif -endif - -# -------------------------------------------------------------------------- diff --git a/src/plugins/wp/share/Makefile.resources b/src/plugins/wp/share/Makefile.resources index 4fea780bb2adefba6f7d67c28ebf9904ab6f2adb..f28c1d26ae72c9c86b50ff23477f1a55a46bbc51 100644 --- a/src/plugins/wp/share/Makefile.resources +++ b/src/plugins/wp/share/Makefile.resources @@ -39,93 +39,6 @@ WHY3_LIBS_CEA:= \ ## Used in share/why3 WHY3_API_LIBS_CEA:= WHY3_LIBS_CEA -# -------------------------------------------------------------------------- -# --- Coq Libraries -# -------------------------------------------------------------------------- - -## Used in share/coqwp - -COQ_LIBS_CEA:= \ - ArcTrigo.v \ - Bits.v \ - Cbits.v \ - Cfloat.v \ - Cint.v \ - Cmath.v \ - Square.v \ - ExpLog.v \ - Memory.v \ - Qed.v \ - Qedlib.v \ - Vset.v \ - Vlist.v \ - Zbits.v - -COQ_LIBS_INRIA:=\ - BuiltIn.v \ - HighOrd.v \ - bool/Bool.v \ - int/Abs.v \ - int/ComputerDivision.v \ - int/EuclideanDivision.v \ - int/ComputerOfEuclideanDivision.v \ - int/Exponentiation.v \ - int/Int.v \ - int/MinMax.v \ - int/Power.v \ - map/Map.v \ - map/Const.v \ - real/Abs.v \ - real/FromInt.v \ - real/MinMax.v \ - real/Real.v \ - real/RealInfix.v \ - real/Square.v \ - real/ExpLog.v \ - real/PowerReal.v \ - real/Trigonometry.v - -# -------------------------------------------------------------------------- -# --- Alt-Ergo Libraries -# -------------------------------------------------------------------------- - -# Used in share/ergo - -ERGO_LIBS_CEA:= \ - ArcTrigo.mlw \ - Cbits.mlw \ - Cfloat.mlw \ - Cint.mlw \ - Cmath.mlw \ - Square.mlw \ - ExpLog.mlw \ - Memory.mlw \ - Qed.mlw \ - Vset.mlw \ - Vlist.mlw - -ERGO_LIBS_INRIA:= \ - bool.Bool.mlw \ - int.Abs.mlw \ - int.ComputerDivision.mlw \ - int.ComputerOfEuclideanDivision.mlw \ - int.Int.mlw \ - int.MinMax.mlw \ - map.Map.mlw \ - map.Const.mlw \ - real.Abs.mlw \ - real.FromInt.mlw \ - real.MinMax.mlw \ - real.Real.mlw \ - real.RealInfix.mlw \ - real.Square.mlw \ - real.Truncate.mlw \ - real.ExpLog.mlw \ - real.PowerReal.mlw \ - real.Trigonometry.mlw \ - real.Hyperbolic.mlw \ - real.Polar.mlw - # -------------------------------------------------------------------------- # --- LICENSES # -------------------------------------------------------------------------- @@ -135,23 +48,13 @@ ERGO_LIBS_INRIA:= \ WP_SHARE_SRC_CEA_RESOURCES:= \ wp.driver \ why3/coq.drv \ - $(addprefix why3/frama_c_wp/, $(WHY3_LIBS_CEA)) \ - $(addprefix coqwp/, $(COQ_LIBS_CEA)) \ - $(addprefix ergo/, $(ERGO_LIBS_CEA)) + $(addprefix why3/frama_c_wp/, $(WHY3_LIBS_CEA)) ALL_CEA_RESOURCES+= \ install.ml \ Makefile.resources \ - Makefile.coqwp \ $(WP_SHARE_SRC_CEA_RESOURCES) -ALL_UNMODIFIED_WHY3_RESOURCES:= \ - $(addprefix coqwp/, $(COQ_LIBS_INRIA)) - -ALL_MODIFIED_WHY3_RESOURCES:= \ - $(addprefix ergo/, $(ERGO_LIBS_INRIA)) - - ########################################################################## # Local Variables: # mode: makefile diff --git a/src/plugins/wp/share/ergo/Cbits.mlw b/src/plugins/wp/share/ergo/Cbits.mlw deleted file mode 100644 index fc3e1ca738f67ed6005195dded8d1ced08f70a4f..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/Cbits.mlw +++ /dev/null @@ -1,553 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory Qed_ must be appended to this file*) -(** The theory bool_Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -(** The theory int_Abs_ must be appended to this file*) -(** The theory int_ComputerDivision_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -(** The theory real_RealInfix_ must be appended to this file*) -(** The theory real_FromInt_ must be appended to this file*) -(** The theory Cint_ must be appended to this file*) - -logic bit_testb : int, int -> bool - -logic bit_test : int, int -> prop - -logic lnot : int -> int - -logic ac land : int, int -> int - -logic ac lxor : int, int -> int - -logic ac lor : int, int -> int - -logic lsl : int, int -> int - -logic lsr : int, int -> int - -axiom lnot_bool : (lnot(0) = (-1)) - -axiom lnot_bool1 : (lnot((-1)) = 0) - -axiom land_idemp : (forall x:int [land(x, x)]. (land(x, x) = x)) - -axiom land_0 : (forall x:int [land(0, x)]. (land(0, x) = 0)) - -axiom land_0bis : (forall x:int [land(x, 0)]. (land(x, 0) = 0)) - -axiom land_1 : (forall x:int [land((-1), x)]. (land((-1), x) = x)) - -axiom land_1bis : (forall x:int [land(x, (-1))]. (land(x, (-1)) = x)) - -axiom lor_idemp : (forall x:int [lor(x, x)]. (lor(x, x) = x)) - -axiom lor_1 : (forall x:int [lor((-1), x)]. (lor((-1), x) = (-1))) - -axiom lor_1bis : (forall x:int [lor(x, (-1))]. (lor(x, (-1)) = (-1))) - -axiom lor_0 : (forall x:int [lor(0, x)]. (lor(0, x) = x)) - -axiom lor_0bis : (forall x:int [lor(x, 0)]. (lor(x, 0) = x)) - -axiom lxor_nilpotent : (forall x:int [lxor(x, x)]. (lxor(x, x) = 0)) - -axiom lxor_1 : (forall x:int [lxor((-1), x)]. (lxor((-1), x) = lnot(x))) - -axiom lxor_1bis : (forall x:int [lxor(x, (-1))]. (lxor(x, (-1)) = lnot(x))) - -axiom lxor_0 : (forall x:int [lxor(0, x)]. (lxor(0, x) = x)) - -axiom lxor_0bis : (forall x:int [lxor(x, 0)]. (lxor(x, 0) = x)) - -axiom lsl_0 : (forall x:int. (lsl(x, 0) = x)) - -axiom lsl_1 : (forall x:int. (lsl(x, 1) = (2 * x))) - -axiom lsl_add : - (forall x:int. forall p:int. forall q:int. ((0 <= p) -> ((0 <= q) -> - (lsl(lsl(x, p), q) = lsl(x, (p + q)))))) - -axiom lsr_0 : (forall x:int. (lsr(x, 0) = x)) - -axiom lsr_1 : (forall x:int. ((0 <= x) -> (lsr(x, 1) = div(x,2)))) - -axiom lsr_add : - (forall x:int. forall p:int. forall q:int. ((0 <= p) -> ((0 <= q) -> - (lsr(lsr(x, p), q) = lsr(x, (p + q)))))) - -axiom lsl_lsr_add : - (forall x:int. forall p:int. forall q:int. (((0 <= q) and (q <= p)) -> - (lsr(lsl(x, p), q) = lsl(x, (p - q))))) - -axiom bit_test_def : - (forall x:int. forall k:int [bit_testb(x, k)]. ((bit_testb(x, k) = true) -> - bit_test(x, k))) - -axiom bit_test_def1 : - (forall x:int. forall k:int [bit_testb(x, k)]. (bit_test(x, k) -> - (bit_testb(x, k) = true))) - -axiom bit_test_extraction : - (forall x:int. forall k:int [land(x, lsl(1, k))| land(lsl(1, k), x)]. - ((0 <= k) -> ((not (land(x, lsl(1, k)) = 0)) -> bit_test(x, k)))) - -axiom bit_test_extraction1 : - (forall x:int. forall k:int [land(x, lsl(1, k))| land(lsl(1, k), x)]. - ((0 <= k) -> (bit_test(x, k) -> (not (land(x, lsl(1, k)) = 0))))) - -axiom lsl_1_0 : (lsl(1, 0) = 1) - -axiom bit_test_extraction_bis : - (forall x:int [land(x, 1)| land(1, x)]. ((not (land(1, x) = 0)) -> - bit_test(x, 0))) - -axiom bit_test_extraction_bis_eq : - (forall x:int [land(x, 1)| land(1, x)]. (bit_test(x, 0) -> (land(1, - x) = 1))) - -axiom lnot_extraction : - (forall x:int. forall i:int [bit_test(lnot(x), i)]. ((0 <= i) -> - (bit_test(lnot(x), i) -> (not bit_test(x, i))))) - -axiom lnot_extraction1 : - (forall x:int. forall i:int [bit_test(lnot(x), i)]. ((0 <= i) -> - ((not bit_test(x, i)) -> bit_test(lnot(x), i)))) - -axiom land_extraction : - (forall x:int. forall y:int. forall i:int [bit_test(land(x, y), i)]. - ((0 <= i) -> (bit_test(land(x, y), i) -> bit_test(x, i)))) - -axiom land_extraction1 : - (forall x:int. forall y:int. forall i:int [bit_test(land(x, y), i)]. - ((0 <= i) -> (bit_test(land(x, y), i) -> bit_test(y, i)))) - -axiom land_extraction2 : - (forall x:int. forall y:int. forall i:int [bit_test(land(x, y), i)]. - ((0 <= i) -> ((bit_test(x, i) and bit_test(y, i)) -> bit_test(land(x, y), - i)))) - -axiom lor_extraction : - (forall x:int. forall y:int. forall i:int [bit_test(lor(x, y), i)]. - ((0 <= i) -> (bit_test(lor(x, y), i) -> (bit_test(x, i) or bit_test(y, - i))))) - -axiom lor_extraction1 : - (forall x:int. forall y:int. forall i:int [bit_test(lor(x, y), i)]. - ((0 <= i) -> ((bit_test(x, i) or bit_test(y, i)) -> bit_test(lor(x, y), - i)))) - -axiom lxor_extraction : - (forall x:int. forall y:int. forall i:int [bit_test(lxor(x, y), i)]. - ((0 <= i) -> (bit_test(lxor(x, y), i) -> (bit_test(x, i) -> - (not bit_test(y, i)))))) - -axiom lxor_extraction1 : - (forall x:int. forall y:int. forall i:int [bit_test(lxor(x, y), i)]. - ((0 <= i) -> (bit_test(lxor(x, y), i) -> ((not bit_test(y, i)) -> - bit_test(x, i))))) - -axiom lxor_extraction2 : - (forall x:int. forall y:int. forall i:int [bit_test(lxor(x, y), i)]. - ((0 <= i) -> ((bit_test(x, i) <-> (not bit_test(y, i))) -> bit_test(lxor(x, - y), i)))) - -axiom land_1_lsl_1 : - (forall a:int. forall x:int. forall n:int [lsl(1, (1 + n)), lsl(1, n), - ((2 * a) + land(1, x))]. ((0 <= n) -> ((a < lsl(1, n)) -> - (((2 * a) + land(1, x)) < lsl(1, (1 + n)))))) - -axiom lsl_extraction_sup : - (forall x:int. forall n:int. forall m:int [bit_test(lsl(x, n), m)]. - ((0 <= n) -> ((0 <= m) -> ((n <= m) -> (bit_test(lsl(x, n), m) -> - bit_test(x, (m - n))))))) - -axiom lsl_extraction_sup1 : - (forall x:int. forall n:int. forall m:int [bit_test(lsl(x, n), m)]. - ((0 <= n) -> ((0 <= m) -> ((n <= m) -> (bit_test(x, (m - n)) -> - bit_test(lsl(x, n), m)))))) - -axiom lsl_extraction_inf : - (forall x:int. forall n:int. forall m:int [bit_test(lsl(x, n), m)]. - ((0 <= n) -> ((0 <= m) -> ((m < n) -> (not bit_test(lsl(x, n), m)))))) - -axiom lsr_extractionl : - (forall x:int. forall n:int. forall m:int [bit_test(lsr(x, n), m)]. - ((0 <= n) -> ((0 <= m) -> (bit_test(lsr(x, n), m) -> bit_test(x, - (m + n)))))) - -axiom lsr_extractionl1 : - (forall x:int. forall n:int. forall m:int [bit_test(lsr(x, n), m)]. - ((0 <= n) -> ((0 <= m) -> (bit_test(x, (m + n)) -> bit_test(lsr(x, n), - m))))) - -axiom lsl1_extraction : - (forall i:int. forall j:int [bit_test(lsl(1, i), j)]. ((0 <= i) -> - ((0 <= j) -> (bit_test(lsl(1, i), j) -> (i = j))))) - -axiom lsl1_extraction1 : - (forall i:int. forall j:int [bit_test(lsl(1, i), j)]. ((0 <= i) -> - ((0 <= j) -> ((i = j) -> bit_test(lsl(1, i), j))))) - -axiom to_uint8_extraction_sup : - (forall x:int. forall i:int [is_uint8(x), bit_test(x, i)]. ((8 <= i) -> - (is_uint8(x) -> (not bit_test(x, i))))) - -axiom to_uint8_extraction_inf : - (forall x:int. forall i:int [bit_test(to_uint8(x), i)]. (((0 <= i) and - (i < 8)) -> (bit_test(to_uint8(x), i) -> bit_test(x, i)))) - -axiom to_uint8_extraction_inf1 : - (forall x:int. forall i:int [bit_test(to_uint8(x), i)]. (((0 <= i) and - (i < 8)) -> (bit_test(x, i) -> bit_test(to_uint8(x), i)))) - -axiom to_uint16_extraction_sup : - (forall x:int. forall i:int [is_uint16(x), bit_test(x, i)]. ((16 <= i) -> - (is_uint16(x) -> (not bit_test(x, i))))) - -axiom to_uint16_extraction_inf : - (forall x:int. forall i:int [bit_test(to_uint16(x), i)]. (((0 <= i) and - (i < 16)) -> (bit_test(to_uint16(x), i) -> bit_test(x, i)))) - -axiom to_uint16_extraction_inf1 : - (forall x:int. forall i:int [bit_test(to_uint16(x), i)]. (((0 <= i) and - (i < 16)) -> (bit_test(x, i) -> bit_test(to_uint16(x), i)))) - -axiom to_uint32_extraction_sup : - (forall x:int. forall i:int [is_uint32(x), bit_test(x, i)]. ((32 <= i) -> - (is_uint32(x) -> (not bit_test(x, i))))) - -axiom to_uint32_extraction_inf : - (forall x:int. forall i:int [bit_test(to_uint32(x), i)]. (((0 <= i) and - (i < 32)) -> (bit_test(to_uint32(x), i) -> bit_test(x, i)))) - -axiom to_uint32_extraction_inf1 : - (forall x:int. forall i:int [bit_test(to_uint32(x), i)]. (((0 <= i) and - (i < 32)) -> (bit_test(x, i) -> bit_test(to_uint32(x), i)))) - -axiom to_uint64_extraction_sup : - (forall x:int. forall i:int [is_uint64(x), bit_test(x, i)]. ((64 <= i) -> - (is_uint64(x) -> (not bit_test(x, i))))) - -axiom to_uint64_extraction_inf : - (forall x:int. forall i:int [bit_test(to_uint64(x), i)]. (((0 <= i) and - (i < 64)) -> (bit_test(to_uint64(x), i) -> bit_test(x, i)))) - -axiom to_uint64_extraction_inf1 : - (forall x:int. forall i:int [bit_test(to_uint64(x), i)]. (((0 <= i) and - (i < 64)) -> (bit_test(x, i) -> bit_test(to_uint64(x), i)))) - -axiom to_sint8_extraction_sup : - (forall x:int. forall i:int [is_sint8(x), bit_test(x, i)]. ((7 <= i) -> - (is_sint8(x) -> (bit_test(x, i) -> (x < 0))))) - -axiom to_sint8_extraction_sup1 : - (forall x:int. forall i:int [is_sint8(x), bit_test(x, i)]. ((7 <= i) -> - (is_sint8(x) -> ((x < 0) -> bit_test(x, i))))) - -axiom to_sint8_extraction_inf : - (forall x:int. forall i:int [bit_test(to_sint8(x), i)]. (((0 <= i) and - (i < 7)) -> (bit_test(to_sint8(x), i) -> bit_test(x, i)))) - -axiom to_sint8_extraction_inf1 : - (forall x:int. forall i:int [bit_test(to_sint8(x), i)]. (((0 <= i) and - (i < 7)) -> (bit_test(x, i) -> bit_test(to_sint8(x), i)))) - -axiom to_sint16_extraction_sup : - (forall x:int. forall i:int [is_sint16(x), bit_test(x, i)]. ((15 <= i) -> - (is_sint16(x) -> (bit_test(x, i) -> (x < 0))))) - -axiom to_sint16_extraction_sup1 : - (forall x:int. forall i:int [is_sint16(x), bit_test(x, i)]. ((15 <= i) -> - (is_sint16(x) -> ((x < 0) -> bit_test(x, i))))) - -axiom to_sint16_extraction_inf : - (forall x:int. forall i:int [bit_test(to_sint16(x), i)]. (((0 <= i) and - (i < 15)) -> (bit_test(to_sint16(x), i) -> bit_test(x, i)))) - -axiom to_sint16_extraction_inf1 : - (forall x:int. forall i:int [bit_test(to_sint16(x), i)]. (((0 <= i) and - (i < 15)) -> (bit_test(x, i) -> bit_test(to_sint16(x), i)))) - -axiom to_sint32_extraction_sup : - (forall x:int. forall i:int [is_sint32(x), bit_test(x, i)]. ((31 <= i) -> - (is_sint32(x) -> (bit_test(x, i) -> (x < 0))))) - -axiom to_sint32_extraction_sup1 : - (forall x:int. forall i:int [is_sint32(x), bit_test(x, i)]. ((31 <= i) -> - (is_sint32(x) -> ((x < 0) -> bit_test(x, i))))) - -axiom to_sint32_extraction_inf : - (forall x:int. forall i:int [bit_test(to_sint32(x), i)]. (((0 <= i) and - (i < 31)) -> (bit_test(to_sint32(x), i) -> bit_test(x, i)))) - -axiom to_sint32_extraction_inf1 : - (forall x:int. forall i:int [bit_test(to_sint32(x), i)]. (((0 <= i) and - (i < 31)) -> (bit_test(x, i) -> bit_test(to_sint32(x), i)))) - -axiom to_sint64_extraction_sup : - (forall x:int. forall i:int [is_sint64(x), bit_test(x, i)]. ((63 <= i) -> - (is_sint64(x) -> (bit_test(x, i) -> (x < 0))))) - -axiom to_sint64_extraction_sup1 : - (forall x:int. forall i:int [is_sint64(x), bit_test(x, i)]. ((63 <= i) -> - (is_sint64(x) -> ((x < 0) -> bit_test(x, i))))) - -axiom to_sint64_extraction_inf : - (forall x:int. forall i:int [bit_test(to_sint64(x), i)]. (((0 <= i) and - (i < 63)) -> (bit_test(to_sint64(x), i) -> bit_test(x, i)))) - -axiom to_sint64_extraction_inf1 : - (forall x:int. forall i:int [bit_test(to_sint64(x), i)]. (((0 <= i) and - (i < 63)) -> (bit_test(x, i) -> bit_test(to_sint64(x), i)))) - -axiom is_uint_lxor : - (forall n:int. forall x:int. forall y:int. (is_uint(n, x) -> (is_uint(n, - y) -> (to_uint(n, lxor(x, y)) = lxor(x, y))))) - -axiom is_uint8_lxor : - (forall x:int. forall y:int [to_uint8(lxor(x, y))]. (is_uint8(x) -> - (is_uint8(y) -> (to_uint8(lxor(x, y)) = lxor(x, y))))) - -axiom is_uint8_lor : - (forall x:int. forall y:int [to_uint8(lor(x, y))]. (is_uint8(x) -> - (is_uint8(y) -> (to_uint8(lor(x, y)) = lor(x, y))))) - -axiom is_uint8_land : - (forall x:int. forall y:int [to_uint8(land(x, y))]. (is_uint8(x) -> - (is_uint8(y) -> (to_uint8(land(x, y)) = land(x, y))))) - -axiom is_uint8_lsr : - (forall x:int. forall y:int [to_uint8(lsr(x, y))]. ((0 <= y) -> - (is_uint8(x) -> (to_uint8(lsr(x, y)) = lsr(x, y))))) - -axiom is_uint8_lsl1_inf : - (forall y:int [to_uint8(lsl(1, y))]. (((0 <= y) and (y < 8)) -> - (to_uint8(lsl(1, y)) = lsl(1, y)))) - -axiom is_uint8_lsl1_sup : - (forall y:int [to_uint8(lsl(1, y))]. ((8 <= y) -> (to_uint8(lsl(1, - y)) = 0))) - -axiom is_uint16_lxor : - (forall x:int. forall y:int [to_uint16(lxor(x, y))]. (is_uint16(x) -> - (is_uint16(y) -> (to_uint16(lxor(x, y)) = lxor(x, y))))) - -axiom is_uint16_lor : - (forall x:int. forall y:int [to_uint16(lor(x, y))]. (is_uint16(x) -> - (is_uint16(y) -> (to_uint16(lor(x, y)) = lor(x, y))))) - -axiom is_uint16_land : - (forall x:int. forall y:int [to_uint16(land(x, y))]. (is_uint16(x) -> - (is_uint16(y) -> (to_uint16(land(x, y)) = land(x, y))))) - -axiom is_uint16_lsr : - (forall x:int. forall y:int [to_uint16(lsr(x, y))]. ((0 <= y) -> - (is_uint16(x) -> (to_uint16(lsr(x, y)) = lsr(x, y))))) - -axiom is_uint16_lsl1_inf : - (forall y:int [to_uint16(lsl(1, y))]. (((0 <= y) and (y < 16)) -> - (to_uint16(lsl(1, y)) = lsl(1, y)))) - -axiom is_uint16_lsl1_sup : - (forall y:int [to_uint16(lsl(1, y))]. ((16 <= y) -> (to_uint16(lsl(1, - y)) = 0))) - -axiom is_uint32_lxor : - (forall x:int. forall y:int [to_uint32(lxor(x, y))]. (is_uint32(x) -> - (is_uint32(y) -> (to_uint32(lxor(x, y)) = lxor(x, y))))) - -axiom is_uint32_lor : - (forall x:int. forall y:int [to_uint32(lor(x, y))]. (is_uint32(x) -> - (is_uint32(y) -> (to_uint32(lor(x, y)) = lor(x, y))))) - -axiom is_uint32_land : - (forall x:int. forall y:int [to_uint32(land(x, y))]. (is_uint32(x) -> - (is_uint32(y) -> (to_uint32(land(x, y)) = land(x, y))))) - -axiom is_uint32_lsr : - (forall x:int. forall y:int [to_uint32(lsr(x, y))]. ((0 <= y) -> - (is_uint32(x) -> (to_uint32(lsr(x, y)) = lsr(x, y))))) - -axiom is_uint32_lsl1_inf : - (forall y:int [to_uint32(lsl(1, y))]. (((0 <= y) and (y < 32)) -> - (to_uint32(lsl(1, y)) = lsl(1, y)))) - -axiom is_uint32_lsl1_sup : - (forall y:int [to_uint32(lsl(1, y))]. ((32 <= y) -> (to_uint32(lsl(1, - y)) = 0))) - -axiom is_uint64_lxor : - (forall x:int. forall y:int [to_uint64(lxor(x, y))]. (is_uint64(x) -> - (is_uint64(y) -> (to_uint64(lxor(x, y)) = lxor(x, y))))) - -axiom is_uint64_lor : - (forall x:int. forall y:int [to_uint64(lor(x, y))]. (is_uint64(x) -> - (is_uint64(y) -> (to_uint64(lor(x, y)) = lor(x, y))))) - -axiom is_uint64_land : - (forall x:int. forall y:int [to_uint64(land(x, y))]. (is_uint64(x) -> - (is_uint64(y) -> (to_uint64(land(x, y)) = land(x, y))))) - -axiom is_uint64_lsr : - (forall x:int. forall y:int [to_uint64(lsr(x, y))]. ((0 <= y) -> - (is_uint64(x) -> (to_uint64(lsr(x, y)) = lsr(x, y))))) - -axiom is_uint64_lsl1_inf : - (forall y:int [to_uint64(lsl(1, y))]. (((0 <= y) and (y < 64)) -> - (to_uint64(lsl(1, y)) = lsl(1, y)))) - -axiom is_uint64_lsl1_sup : - (forall y:int [to_uint64(lsl(1, y))]. ((64 <= y) -> (to_uint64(lsl(1, - y)) = 0))) - -axiom is_sint8_lnot : - (forall x:int [to_sint8(lnot(x))]. (is_sint8(x) -> - (to_sint8(lnot(x)) = lnot(x)))) - -axiom is_sint8_lxor : - (forall x:int. forall y:int [to_sint8(lxor(x, y))]. (is_sint8(x) -> - (is_sint8(y) -> (to_sint8(lxor(x, y)) = lxor(x, y))))) - -axiom is_sint8_lor : - (forall x:int. forall y:int [to_sint8(lor(x, y))]. (is_sint8(x) -> - (is_sint8(y) -> (to_sint8(lor(x, y)) = lor(x, y))))) - -axiom is_sint8_land : - (forall x:int. forall y:int [to_sint8(land(x, y))]. (is_sint8(x) -> - (is_sint8(y) -> (to_sint8(land(x, y)) = land(x, y))))) - -axiom is_sint8_lsr : - (forall x:int. forall y:int [to_sint8(lsr(x, y))]. ((0 <= y) -> - (is_sint8(x) -> (to_sint8(lsr(x, y)) = lsr(x, y))))) - -axiom is_sint8_lsl1 : (lsl(1, 7) = 128) - -axiom is_sint8_lsl1_inf : - (forall y:int [to_sint8(lsl(1, y))]. (((0 <= y) and (y < 7)) -> - (to_sint8(lsl(1, y)) = lsl(1, y)))) - -axiom is_sint8_lsl1_sup : - (forall y:int [to_sint8(lsl(1, y))]. ((8 <= y) -> (to_sint8(lsl(1, - y)) = 0))) - -axiom is_sint16_lnot : - (forall x:int [to_sint16(lnot(x))]. (is_sint16(x) -> - (to_sint16(lnot(x)) = lnot(x)))) - -axiom is_sint16_lxor : - (forall x:int. forall y:int [to_sint16(lxor(x, y))]. (is_sint16(x) -> - (is_sint16(y) -> (to_sint16(lxor(x, y)) = lxor(x, y))))) - -axiom is_sint16_lor : - (forall x:int. forall y:int [to_sint16(lor(x, y))]. (is_sint16(x) -> - (is_sint16(y) -> (to_sint16(lor(x, y)) = lor(x, y))))) - -axiom is_sint16_land : - (forall x:int. forall y:int [to_sint16(land(x, y))]. (is_sint16(x) -> - (is_sint16(y) -> (to_sint16(land(x, y)) = land(x, y))))) - -axiom is_sint16_lsr : - (forall x:int. forall y:int [to_sint16(lsr(x, y))]. ((0 <= y) -> - (is_sint16(x) -> (to_sint16(lsr(x, y)) = lsr(x, y))))) - -axiom is_sint16_lsl1 : (lsl(1, 15) = 32768) - -axiom is_sint16_lsl1_inf : - (forall y:int [to_sint16(lsl(1, y))]. (((0 <= y) and (y < 15)) -> - (to_sint16(lsl(1, y)) = lsl(1, y)))) - -axiom is_sint16_lsl1_sup : - (forall y:int [to_sint16(lsl(1, y))]. ((16 <= y) -> (to_sint16(lsl(1, - y)) = 0))) - -axiom is_sint32_lnot : - (forall x:int [to_sint32(lnot(x))]. (is_sint32(x) -> - (to_sint32(lnot(x)) = lnot(x)))) - -axiom is_sint32_lxor : - (forall x:int. forall y:int [to_sint32(lxor(x, y))]. (is_sint32(x) -> - (is_sint32(y) -> (to_sint32(lxor(x, y)) = lxor(x, y))))) - -axiom is_sint32_lor : - (forall x:int. forall y:int [to_sint32(lor(x, y))]. (is_sint32(x) -> - (is_sint32(y) -> (to_sint32(lor(x, y)) = lor(x, y))))) - -axiom is_sint32_land : - (forall x:int. forall y:int [to_sint32(land(x, y))]. (is_sint32(x) -> - (is_sint32(y) -> (to_sint32(land(x, y)) = land(x, y))))) - -axiom is_sint32_lsr : - (forall x:int. forall y:int [to_sint32(lsr(x, y))]. ((0 <= y) -> - (is_sint32(x) -> (to_sint32(lsr(x, y)) = lsr(x, y))))) - -axiom is_sint32_lsl1 : (lsl(1, 31) = 2147483648) - -axiom is_sint32_lsl1_inf : - (forall y:int [to_sint32(lsl(1, y))]. (((0 <= y) and (y < 31)) -> - (to_sint32(lsl(1, y)) = lsl(1, y)))) - -axiom is_sint32_lsl1_sup : - (forall y:int [to_sint32(lsl(1, y))]. ((32 <= y) -> (to_sint32(lsl(1, - y)) = 0))) - -axiom is_sint64_lnot : - (forall x:int [to_sint64(lnot(x))]. (is_sint64(x) -> - (to_sint64(lnot(x)) = lnot(x)))) - -axiom is_sint64_lxor : - (forall x:int. forall y:int [to_sint64(lxor(x, y))]. (is_sint64(x) -> - (is_sint64(y) -> (to_sint64(lxor(x, y)) = lxor(x, y))))) - -axiom is_sint64_lor : - (forall x:int. forall y:int [to_sint64(lor(x, y))]. (is_sint64(x) -> - (is_sint64(y) -> (to_sint64(lor(x, y)) = lor(x, y))))) - -axiom is_sint64_land : - (forall x:int. forall y:int [to_sint64(land(x, y))]. (is_sint64(x) -> - (is_sint64(y) -> (to_sint64(land(x, y)) = land(x, y))))) - -axiom is_sint64_lsr : - (forall x:int. forall y:int [to_sint64(lsr(x, y))]. ((0 <= y) -> - (is_sint64(x) -> (to_sint64(lsr(x, y)) = lsr(x, y))))) - -axiom is_sint64_lsl1 : (lsl(1, 63) = 9223372036854775808) - -axiom is_sint64_lsl1_inf : - (forall y:int [to_sint64(lsl(1, y))]. (((0 <= y) and (y < 63)) -> - (to_sint64(lsl(1, y)) = lsl(1, y)))) - -axiom is_sint64_lsl1_sup : - (forall y:int [to_sint64(lsl(1, y))]. ((64 <= y) -> (to_sint64(lsl(1, - y)) = 0))) - -axiom lor_addition : - (forall x:int. forall y:int [land(x, y), lor(x, y)]. ((land(x, y) = 0) -> - ((x + y) = lor(x, y)))) - -axiom lxor_addition : - (forall x:int. forall y:int [land(x, y), lxor(x, y)]. ((land(x, y) = 0) -> - ((x + y) = lxor(x, y)))) diff --git a/src/plugins/wp/share/ergo/Cfloat.mlw b/src/plugins/wp/share/ergo/Cfloat.mlw deleted file mode 100644 index 8767b09720cadfd0849504b8647b601a1337bd8b..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/Cfloat.mlw +++ /dev/null @@ -1,360 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory bool_Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -(** The theory real_RealInfix_ must be appended to this file*) -(** The theory real_Abs_ must be appended to this file*) -(** The theory real_FromInt_ must be appended to this file*) -(** The theory real_Square_ must be appended to this file*) -type f32 - -type f64 - -logic to_f32 : real -> f32 - -logic of_f32 : f32 -> real - -logic to_f64 : real -> f64 - -logic of_f64 : f64 -> real - -axiom to_f32_zero : (of_f32(to_f32(0.0)) = 0.0) - -axiom to_f32_one : (of_f32(to_f32(1.0)) = 1.0) - -axiom to_f64_zero : (of_f64(to_f64(0.0)) = 0.0) - -axiom to_f64_one : (of_f64(to_f64(1.0)) = 1.0) - -type rounding_mode = Up | Down | ToZero | NearestTiesToAway - | NearestTiesToEven - -logic match_rounding_mode : rounding_mode, 'a, 'a, 'a, 'a, 'a -> 'a - -axiom match_rounding_mode_Up : - (forall z:'a. forall z1:'a. forall z2:'a. forall z3:'a. forall z4:'a. - (match_rounding_mode(Up, z, z1, z2, z3, z4) = z)) - -axiom match_rounding_mode_Down : - (forall z:'a. forall z1:'a. forall z2:'a. forall z3:'a. forall z4:'a. - (match_rounding_mode(Down, z, z1, z2, z3, z4) = z1)) - -axiom match_rounding_mode_ToZero : - (forall z:'a. forall z1:'a. forall z2:'a. forall z3:'a. forall z4:'a. - (match_rounding_mode(ToZero, z, z1, z2, z3, z4) = z2)) - -axiom match_rounding_mode_NearestTiesToAway : - (forall z:'a. forall z1:'a. forall z2:'a. forall z3:'a. forall z4:'a. - (match_rounding_mode(NearestTiesToAway, z, z1, z2, z3, z4) = z3)) - -axiom match_rounding_mode_NearestTiesToEven : - (forall z:'a. forall z1:'a. forall z2:'a. forall z3:'a. forall z4:'a. - (match_rounding_mode(NearestTiesToEven, z, z1, z2, z3, z4) = z4)) - -logic round_float : rounding_mode, real -> f32 - -logic round_double : rounding_mode, real -> f64 - -axiom float_32 : - (forall x:real [round_float(NearestTiesToEven, x)]. - (to_f32(x) = round_float(NearestTiesToEven, x))) - -axiom float_64 : - (forall x:real [round_double(NearestTiesToEven, x)]. - (to_f64(x) = round_double(NearestTiesToEven, x))) - -type float_kind = Finite | NaN | Inf_pos | Inf_neg - -logic match_float_kind : float_kind, 'a, 'a, 'a, 'a -> 'a - -axiom match_float_kind_Finite : - (forall z:'a. forall z1:'a. forall z2:'a. forall z3:'a. - (match_float_kind(Finite, z, z1, z2, z3) = z)) - -axiom match_float_kind_NaN : - (forall z:'a. forall z1:'a. forall z2:'a. forall z3:'a. - (match_float_kind(NaN, z, z1, z2, z3) = z1)) - -axiom match_float_kind_Inf_pos : - (forall z:'a. forall z1:'a. forall z2:'a. forall z3:'a. - (match_float_kind(Inf_pos, z, z1, z2, z3) = z2)) - -axiom match_float_kind_Inf_neg : - (forall z:'a. forall z1:'a. forall z2:'a. forall z3:'a. - (match_float_kind(Inf_neg, z, z1, z2, z3) = z3)) - -logic classify_f32 : f32 -> float_kind - -logic classify_f64 : f64 -> float_kind - -predicate is_finite_f32(f: f32) = (classify_f32(f) = Finite) - -predicate is_finite_f64(d: f64) = (classify_f64(d) = Finite) - -predicate is_NaN_f32(f: f32) = (classify_f32(f) = NaN) - -predicate is_NaN_f64(d: f64) = (classify_f64(d) = NaN) - -predicate is_infinite_f32(f: f32) = ((classify_f32(f) = Inf_pos) or - (classify_f32(f) = Inf_neg)) - -predicate is_infinite_f64(d: f64) = ((classify_f64(d) = Inf_pos) or - (classify_f64(d) = Inf_neg)) - -predicate is_positive_infinite_f32(f: f32) = (classify_f32(f) = Inf_pos) - -predicate is_positive_infinite_f64(d: f64) = (classify_f64(d) = Inf_pos) - -predicate is_negative_infinite_f32(f: f32) = (classify_f32(f) = Inf_neg) - -predicate is_negative_infinite_f64(d: f64) = (classify_f64(d) = Inf_neg) - -axiom is_finite_to_float_32 : - (forall x:real [is_finite_f32(to_f32(x))]. is_finite_f32(to_f32(x))) - -axiom is_finite_to_float_64 : - (forall x:real [is_finite_f64(to_f64(x))]. is_finite_f64(to_f64(x))) - -axiom to_float_is_finite_32 : - (forall f:f32 [to_f32(of_f32(f))| is_finite_f32(f)]. (is_finite_f32(f) -> - (to_f32(of_f32(f)) = f))) - -axiom to_float_is_finite_64 : - (forall d:f64 [to_f64(of_f64(d))| is_finite_f64(d)]. (is_finite_f64(d) -> - (to_f64(of_f64(d)) = d))) - -predicate finite(x: real) = (is_finite_f32(to_f32(x)) and - is_finite_f64(to_f64(x))) - -axiom finite_small_f32 : - (forall x:real. - ((((-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0) <= x) and - (x <= 340282346600000016151267322115014000640.0)) -> - is_finite_f32(to_f32(x)))) - -axiom finite_small_f64 : - (forall x:real. - ((((-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0) <= x) and - (x <= 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0)) -> - is_finite_f64(to_f64(x)))) - -axiom finite_range_f32 : - (forall f:f32. (is_finite_f32(f) -> - ((-340282346600000016151267322115014000640.0) <= of_f32(f)))) - -axiom finite_range_f321 : - (forall f:f32. (is_finite_f32(f) -> - (of_f32(f) <= 340282346600000016151267322115014000640.0))) - -axiom finite_range_f322 : - (forall f:f32. - ((((-340282346600000016151267322115014000640.0) <= of_f32(f)) and - (of_f32(f) <= 340282346600000016151267322115014000640.0)) -> - is_finite_f32(f))) - -axiom finite_range_f64 : - (forall d:f64. (is_finite_f64(d) -> - ((-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0) <= of_f64(d)))) - -axiom finite_range_f641 : - (forall d:f64. (is_finite_f64(d) -> - (of_f64(d) <= 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0))) - -axiom finite_range_f642 : - (forall d:f64. - ((((-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0) <= of_f64(d)) and - (of_f64(d) <= 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0)) -> - is_finite_f64(d))) - -logic eq_f32b : f32, f32 -> bool - -logic eq_f64b : f64, f64 -> bool - -predicate eq_f32(x: f32, y: f32) = (eq_f32b(x, y) = true) - -predicate eq_f64(x: f64, y: f64) = (eq_f64b(x, y) = true) - -axiom eq_finite_f32 : - (forall x:f32. forall y:f32 [eq_f32(x, y)]. (is_finite_f32(x) -> - (is_finite_f32(y) -> (eq_f32(x, y) -> (of_f32(x) = of_f32(y)))))) - -axiom eq_finite_f321 : - (forall x:f32. forall y:f32 [eq_f32(x, y)]. (is_finite_f32(x) -> - (is_finite_f32(y) -> ((of_f32(x) = of_f32(y)) -> eq_f32(x, y))))) - -axiom eq_finite_f64 : - (forall x:f64. forall y:f64 [eq_f64(x, y)]. (is_finite_f64(x) -> - (is_finite_f64(y) -> (eq_f64(x, y) -> (of_f64(x) = of_f64(y)))))) - -axiom eq_finite_f641 : - (forall x:f64. forall y:f64 [eq_f64(x, y)]. (is_finite_f64(x) -> - (is_finite_f64(y) -> ((of_f64(x) = of_f64(y)) -> eq_f64(x, y))))) - -logic ne_f32b : f32, f32 -> bool - -logic ne_f64b : f64, f64 -> bool - -predicate ne_f32(x: f32, y: f32) = (ne_f32b(x, y) = true) - -predicate ne_f64(x: f64, y: f64) = (ne_f64b(x, y) = true) - -axiom ne_finite_f32 : - (forall x:f32. forall y:f32 [ne_f32(x, y)]. (is_finite_f32(x) -> - (is_finite_f32(y) -> (ne_f32(x, y) -> (not (of_f32(x) = of_f32(y))))))) - -axiom ne_finite_f321 : - (forall x:f32. forall y:f32 [ne_f32(x, y)]. (is_finite_f32(x) -> - (is_finite_f32(y) -> ((not (of_f32(x) = of_f32(y))) -> ne_f32(x, y))))) - -axiom ne_finite_f64 : - (forall x:f64. forall y:f64 [ne_f64(x, y)]. (is_finite_f64(x) -> - (is_finite_f64(y) -> (ne_f64(x, y) -> (not (of_f64(x) = of_f64(y))))))) - -axiom ne_finite_f641 : - (forall x:f64. forall y:f64 [ne_f64(x, y)]. (is_finite_f64(x) -> - (is_finite_f64(y) -> ((not (of_f64(x) = of_f64(y))) -> ne_f64(x, y))))) - -logic le_f32b : f32, f32 -> bool - -logic le_f64b : f64, f64 -> bool - -predicate le_f32(x: f32, y: f32) = (le_f32b(x, y) = true) - -predicate le_f64(x: f64, y: f64) = (le_f64b(x, y) = true) - -axiom le_finite_f32 : - (forall x:f32. forall y:f32 [le_f32(x, y)]. (is_finite_f32(x) -> - (is_finite_f32(y) -> (le_f32(x, y) -> (of_f32(x) <= of_f32(y)))))) - -axiom le_finite_f321 : - (forall x:f32. forall y:f32 [le_f32(x, y)]. (is_finite_f32(x) -> - (is_finite_f32(y) -> ((of_f32(x) <= of_f32(y)) -> le_f32(x, y))))) - -axiom le_finite_f64 : - (forall x:f64. forall y:f64 [le_f64(x, y)]. (is_finite_f64(x) -> - (is_finite_f64(y) -> (le_f64(x, y) -> (of_f64(x) <= of_f64(y)))))) - -axiom le_finite_f641 : - (forall x:f64. forall y:f64 [le_f64(x, y)]. (is_finite_f64(x) -> - (is_finite_f64(y) -> ((of_f64(x) <= of_f64(y)) -> le_f64(x, y))))) - -logic lt_f32b : f32, f32 -> bool - -logic lt_f64b : f64, f64 -> bool - -predicate lt_f32(x: f32, y: f32) = (lt_f32b(x, y) = true) - -predicate lt_f64(x: f64, y: f64) = (lt_f64b(x, y) = true) - -axiom lt_finite_f32 : - (forall x:f32. forall y:f32 [lt_f32(x, y)]. (is_finite_f32(x) -> - (is_finite_f32(y) -> (lt_f32(x, y) -> (of_f32(x) < of_f32(y)))))) - -axiom lt_finite_f321 : - (forall x:f32. forall y:f32 [lt_f32(x, y)]. (is_finite_f32(x) -> - (is_finite_f32(y) -> ((of_f32(x) < of_f32(y)) -> lt_f32(x, y))))) - -axiom lt_finite_f64 : - (forall x:f64. forall y:f64 [lt_f64(x, y)]. (is_finite_f64(x) -> - (is_finite_f64(y) -> (lt_f64(x, y) -> (of_f64(x) < of_f64(y)))))) - -axiom lt_finite_f641 : - (forall x:f64. forall y:f64 [lt_f64(x, y)]. (is_finite_f64(x) -> - (is_finite_f64(y) -> ((of_f64(x) < of_f64(y)) -> lt_f64(x, y))))) - -logic neg_f32 : f32 -> f32 - -logic neg_f64 : f64 -> f64 - -axiom neg_finite_f32 : - (forall x:f32 [neg_f32(x)]. (is_finite_f32(x) -> - (of_f32(neg_f32(x)) = (-of_f32(x))))) - -axiom neg_finite_f64 : - (forall x:f64 [neg_f64(x)]. (is_finite_f64(x) -> - (of_f64(neg_f64(x)) = (-of_f64(x))))) - -logic add_f32 : f32, f32 -> f32 - -logic add_f64 : f64, f64 -> f64 - -axiom add_finite_f32 : - (forall x:f32. forall y:f32 [add_f32(x, y)]. (is_finite_f32(x) -> - (is_finite_f32(y) -> (add_f32(x, y) = to_f32((of_f32(x) + of_f32(y))))))) - -axiom add_finite_f64 : - (forall x:f64. forall y:f64 [add_f64(x, y)]. (is_finite_f64(x) -> - (is_finite_f64(y) -> (add_f64(x, y) = to_f64((of_f64(x) + of_f64(y))))))) - -logic mul_f32 : f32, f32 -> f32 - -logic mul_f64 : f64, f64 -> f64 - -axiom mul_finite_f32 : - (forall x:f32. forall y:f32 [mul_f32(x, y)]. (is_finite_f32(x) -> - (is_finite_f32(y) -> (mul_f32(x, y) = to_f32((of_f32(x) * of_f32(y))))))) - -axiom mul_finite_f64 : - (forall x:f64. forall y:f64 [mul_f64(x, y)]. (is_finite_f64(x) -> - (is_finite_f64(y) -> (mul_f64(x, y) = to_f64((of_f64(x) * of_f64(y))))))) - -logic div_f32 : f32, f32 -> f32 - -logic div_f64 : f64, f64 -> f64 - -axiom div_finite_f32 : - (forall x:f32. forall y:f32 [div_f32(x, y)]. (is_finite_f32(x) -> - (is_finite_f32(y) -> (div_f32(x, y) = to_f32((of_f32(x) / of_f32(y))))))) - -axiom div_finite_f64 : - (forall x:f64. forall y:f64 [div_f64(x, y)]. (is_finite_f64(x) -> - (is_finite_f64(y) -> (div_f64(x, y) = to_f64((of_f64(x) / of_f64(y))))))) - -logic sqrt_f32 : f32 -> f32 - -logic sqrt_f64 : f64 -> f64 - -axiom sqrt_finite_f32 : - (forall x:f32 [sqrt_f32(x)]. (is_finite_f32(x) -> - (sqrt_f32(x) = to_f32(sqrt(of_f32(x)))))) - -axiom sqrt_finite_f64 : - (forall x:f64 [sqrt_f64(x)]. (is_finite_f64(x) -> - (sqrt_f64(x) = to_f64(sqrt(of_f64(x)))))) - -logic model_f32 : f32 -> real - -function delta_f32(f: f32) : real = abs_real((of_f32(f) - model_f32(f))) - -function error_f32(f: f32) : real = (delta_f32(f) / abs_real(model_f32(f))) - -logic model_f64 : f64 -> real - -function delta_f64(f: f64) : real = abs_real((of_f64(f) - model_f64(f))) - -function error_f64(f: f64) : real = (delta_f64(f) / abs_real(model_f64(f))) - diff --git a/src/plugins/wp/share/ergo/Cint.mlw b/src/plugins/wp/share/ergo/Cint.mlw deleted file mode 100644 index 7dab26534909598507551f442cd70d138ea49697..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/Cint.mlw +++ /dev/null @@ -1,224 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory bool_Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -predicate is_bool(x: int) = ((x = 0) or (x = 1)) - -logic is_uint8 : int -> prop - -axiom is_uint8_def : (forall x:int [is_uint8(x)]. (is_uint8(x) -> (0 <= x))) - -axiom is_uint8_def1 : - (forall x:int [is_uint8(x)]. (is_uint8(x) -> (x < 256))) - -axiom is_uint8_def2 : - (forall x:int [is_uint8(x)]. (((0 <= x) and (x < 256)) -> is_uint8(x))) - -logic is_sint8 : int -> prop - -axiom is_sint8_def : - (forall x:int [is_sint8(x)]. (is_sint8(x) -> ((-128) <= x))) - -axiom is_sint8_def1 : - (forall x:int [is_sint8(x)]. (is_sint8(x) -> (x < 128))) - -axiom is_sint8_def2 : - (forall x:int [is_sint8(x)]. ((((-128) <= x) and (x < 128)) -> - is_sint8(x))) - -logic is_uint16 : int -> prop - -axiom is_uint16_def : - (forall x:int [is_uint16(x)]. (is_uint16(x) -> (0 <= x))) - -axiom is_uint16_def1 : - (forall x:int [is_uint16(x)]. (is_uint16(x) -> (x < 65536))) - -axiom is_uint16_def2 : - (forall x:int [is_uint16(x)]. (((0 <= x) and (x < 65536)) -> - is_uint16(x))) - -predicate is_sint16(x: int) = (((-32768) <= x) and (x < 32768)) - -logic is_uint32 : int -> prop - -axiom is_uint32_def : - (forall x:int [is_uint32(x)]. (is_uint32(x) -> (0 <= x))) - -axiom is_uint32_def1 : - (forall x:int [is_uint32(x)]. (is_uint32(x) -> (x < 4294967296))) - -axiom is_uint32_def2 : - (forall x:int [is_uint32(x)]. (((0 <= x) and (x < 4294967296)) -> - is_uint32(x))) - -logic is_sint32 : int -> prop - -axiom is_sint32_def : - (forall x:int [is_sint32(x)]. (is_sint32(x) -> ((-2147483648) <= x))) - -axiom is_sint32_def1 : - (forall x:int [is_sint32(x)]. (is_sint32(x) -> (x < 2147483648))) - -axiom is_sint32_def2 : - (forall x:int [is_sint32(x)]. ((((-2147483648) <= x) and - (x < 2147483648)) -> is_sint32(x))) - -logic is_uint64 : int -> prop - -axiom is_uint64_def : - (forall x:int [is_uint64(x)]. (is_uint64(x) -> (0 <= x))) - -axiom is_uint64_def1 : - (forall x:int [is_uint64(x)]. (is_uint64(x) -> - (x < 18446744073709551616))) - -axiom is_uint64_def2 : - (forall x:int [is_uint64(x)]. (((0 <= x) and - (x < 18446744073709551616)) -> is_uint64(x))) - -logic is_sint64 : int -> prop - -axiom is_sint64_def : - (forall x:int [is_sint64(x)]. (is_sint64(x) -> - ((-9223372036854775808) <= x))) - -axiom is_sint64_def1 : - (forall x:int [is_sint64(x)]. (is_sint64(x) -> (x < 9223372036854775808))) - -axiom is_sint64_def2 : - (forall x:int [is_sint64(x)]. ((((-9223372036854775808) <= x) and - (x < 9223372036854775808)) -> is_sint64(x))) - -axiom is_bool0 : is_bool(0) - -axiom is_bool1 : is_bool(1) - -logic to_bool : int -> int - -axiom to_bool_def : (forall x:int. ((x = 0) -> (to_bool(x) = 0))) - -axiom to_bool_def1 : (forall x:int. ((not (x = 0)) -> (to_bool(x) = 1))) - -logic to_uint8 : int -> int - -logic to_sint8 : int -> int - -logic to_uint16 : int -> int - -logic to_sint16 : int -> int - -logic to_uint32 : int -> int - -logic to_sint32 : int -> int - -logic to_uint64 : int -> int - -logic to_sint64 : int -> int - -logic two_power_abs : int -> int - -predicate is_uint(n: int, x: int) = ((0 <= x) and (x < two_power_abs(n))) - -predicate is_sint(n: int, x: int) = (((-two_power_abs(n)) <= x) and - (x < two_power_abs(n))) - -logic to_uint : int, int -> int - -logic to_sint : int, int -> int - -axiom is_to_uint8 : - (forall x:int [is_uint8(to_uint8(x))]. is_uint8(to_uint8(x))) - -axiom is_to_sint8 : - (forall x:int [is_sint8(to_sint8(x))]. is_sint8(to_sint8(x))) - -axiom is_to_uint16 : - (forall x:int [is_uint16(to_uint16(x))]. is_uint16(to_uint16(x))) - -axiom is_to_sint16 : - (forall x:int [is_sint16(to_sint16(x))]. is_sint16(to_sint16(x))) - -axiom is_to_uint32 : - (forall x:int [is_uint32(to_uint32(x))]. is_uint32(to_uint32(x))) - -axiom is_to_sint32 : - (forall x:int [is_sint32(to_sint32(x))]. is_sint32(to_sint32(x))) - -axiom is_to_uint64 : - (forall x:int [is_uint64(to_uint64(x))]. is_uint64(to_uint64(x))) - -axiom is_to_sint64 : - (forall x:int [is_sint64(to_sint64(x))]. is_sint64(to_sint64(x))) - -axiom id_uint8 : - (forall x:int [to_uint8(x)]. (((0 <= x) and (x < 256)) -> - (to_uint8(x) = x))) - -axiom id_sint8 : - (forall x:int [to_sint8(x)]. ((((-128) <= x) and (x < 128)) -> - (to_sint8(x) = x))) - -axiom id_uint16 : - (forall x:int [to_uint16(x)]. (((0 <= x) and (x < 65536)) -> - (to_uint16(x) = x))) - -axiom id_sint16 : - (forall x:int [to_sint16(x)]. ((((-32768) <= x) and (x < 32768)) -> - (to_sint16(x) = x))) - -axiom id_uint32 : - (forall x:int [to_uint32(x)]. (((0 <= x) and (x < 4294967296)) -> - (to_uint32(x) = x))) - -axiom id_sint32 : - (forall x:int [to_sint32(x)]. ((((-2147483648) <= x) and - (x < 2147483648)) -> (to_sint32(x) = x))) - -axiom id_uint64 : - (forall x:int [to_uint64(x)]. (((0 <= x) and - (x < 18446744073709551616)) -> (to_uint64(x) = x))) - -axiom id_sint64 : - (forall x:int [to_sint64(x)]. ((((-9223372036854775808) <= x) and - (x < 9223372036854775808)) -> (to_sint64(x) = x))) - -axiom proj_int8 : - (forall x:int [to_sint8(to_uint8(x))]. - (to_sint8(to_uint8(x)) = to_sint8(x))) - -axiom proj_int16 : - (forall x:int [to_sint16(to_uint16(x))]. - (to_sint16(to_uint16(x)) = to_sint16(x))) - -axiom proj_int32 : - (forall x:int [to_sint32(to_uint32(x))]. - (to_sint32(to_uint32(x)) = to_sint32(x))) - -axiom proj_int64 : - (forall x:int [to_sint64(to_uint64(x))]. - (to_sint64(to_uint64(x)) = to_sint64(x))) - diff --git a/src/plugins/wp/share/ergo/Memory.mlw b/src/plugins/wp/share/ergo/Memory.mlw deleted file mode 100644 index 32ac4406cf93bca73f2a0222d9844a96c472880a..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/Memory.mlw +++ /dev/null @@ -1,212 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory bool_Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -(** The theory map_Map_ must be appended to this file*) -type addr = { base : int; offset : int -} - -logic addr_le : addr, addr -> prop - -logic addr_lt : addr, addr -> prop - -logic addr_le_bool : addr, addr -> bool - -logic addr_lt_bool : addr, addr -> bool - -axiom addr_le_def : - (forall p:addr. forall q:addr [addr_le(p, q)]. (((p).base = (q).base) -> - (addr_le(p, q) -> ((p).offset <= (q).offset)))) - -axiom addr_le_def1 : - (forall p:addr. forall q:addr [addr_le(p, q)]. (((p).base = (q).base) -> - (((p).offset <= (q).offset) -> addr_le(p, q)))) - -axiom addr_lt_def : - (forall p:addr. forall q:addr [addr_lt(p, q)]. (((p).base = (q).base) -> - (addr_lt(p, q) -> ((p).offset < (q).offset)))) - -axiom addr_lt_def1 : - (forall p:addr. forall q:addr [addr_lt(p, q)]. (((p).base = (q).base) -> - (((p).offset < (q).offset) -> addr_lt(p, q)))) - -axiom addr_le_bool_def : - (forall p:addr. forall q:addr [addr_le_bool(p, q)]. (addr_le(p, q) -> - (addr_le_bool(p, q) = true))) - -axiom addr_le_bool_def1 : - (forall p:addr. forall q:addr [addr_le_bool(p, q)]. ((addr_le_bool(p, - q) = true) -> addr_le(p, q))) - -axiom addr_lt_bool_def : - (forall p:addr. forall q:addr [addr_lt_bool(p, q)]. (addr_lt(p, q) -> - (addr_lt_bool(p, q) = true))) - -axiom addr_lt_bool_def1 : - (forall p:addr. forall q:addr [addr_lt_bool(p, q)]. ((addr_lt_bool(p, - q) = true) -> addr_lt(p, q))) - -function null() : addr = { base = 0; offset = 0 } - -function global(b: int) : addr = { base = b; offset = 0 } - -function shift(p: addr, k: int) : addr = { base = (p).base; offset = - ((p).offset + k) } - -predicate included(p: addr, a: int, q: addr, b: int) = ((0 < a) -> - ((0 <= b) and (((p).base = (q).base) and (((q).offset <= (p).offset) and - (((p).offset + a) <= ((q).offset + b)))))) - -predicate separated(p: addr, a: int, q: addr, b: int) = ((a <= 0) or - ((b <= 0) or ((not ((p).base = (q).base)) or - ((((q).offset + b) <= (p).offset) or (((p).offset + a) <= (q).offset))))) - -predicate eqmem(m1: (addr,'a) farray, m2: (addr,'a) farray, p: addr, - a1: int) = - (forall q:addr [(m1[p])| (m2[q])]. (included(q, 1, p, a1) -> - ((m1[q]) = (m2[q])))) - -logic havoc : (addr,'a) farray, (addr,'a) farray, addr, - int -> (addr,'a) farray - -predicate valid_rw(m: (int,int) farray, p: addr, n: int) = ((0 < n) -> - ((0 < (p).base) and ((0 <= (p).offset) and - (((p).offset + n) <= (m[(p).base]))))) - -predicate valid_rd(m: (int,int) farray, p: addr, n: int) = ((0 < n) -> - ((not (0 = (p).base)) and ((0 <= (p).offset) and - (((p).offset + n) <= (m[(p).base]))))) - -predicate invalid(m: (int,int) farray, p: addr, n: int) = ((0 < n) -> - (((m[(p).base]) <= (p).offset) or (((p).offset + n) <= 0))) - -axiom valid_rw_rd : - (forall m:(int,int) farray. - (forall p:addr. (forall n:int. (valid_rw(m, p, n) -> valid_rd(m, p, n))))) - -axiom valid_string : - (forall m:(int,int) farray. - (forall p:addr. (((p).base < 0) -> (((0 <= (p).offset) and - ((p).offset < (m[(p).base]))) -> valid_rd(m, p, 1))))) - -axiom valid_string1 : - (forall m:(int,int) farray. - (forall p:addr. (((p).base < 0) -> (((0 <= (p).offset) and - ((p).offset < (m[(p).base]))) -> (not valid_rw(m, p, 1)))))) - -axiom separated_1 : - (forall p:addr. forall q:addr. - (forall a:int. forall b:int. forall i:int. forall j:int [separated(p, a, q, - b), { base = (p).base; offset = i }, { base = (q).base; offset = j }]. - (separated(p, a, q, b) -> ((((p).offset <= i) and - (i < ((p).offset + a))) -> ((((q).offset <= j) and - (j < ((q).offset + b))) -> (not ({ base = (p).base; offset = i } = { - base = (q).base; offset = j }))))))) - -logic region : int -> int - -logic linked : (int,int) farray -> prop - -logic sconst : (addr,int) farray -> prop - -predicate framed(m: (addr,addr) farray) = - (forall p:addr [(m[p])]. (region(((m[p])).base) <= 0)) - -axiom separated_included : - (forall p:addr. forall q:addr. - (forall a:int. forall b:int [separated(p, a, q, b), included(p, a, q, b)]. - ((0 < a) -> ((0 < b) -> (separated(p, a, q, b) -> (not included(p, a, q, - b))))))) - -axiom included_trans : - (forall p:addr. forall q:addr. forall r:addr. - (forall a:int. forall b:int. forall c:int [included(p, a, q, b), - included(q, b, r, c)]. (included(p, a, q, b) -> (included(q, b, r, c) -> - included(p, a, r, c))))) - -axiom separated_trans : - (forall p:addr. forall q:addr. forall r:addr. - (forall a:int. forall b:int. forall c:int [included(p, a, q, b), - separated(q, b, r, c)]. (included(p, a, q, b) -> (separated(q, b, r, c) -> - separated(p, a, r, c))))) - -axiom separated_sym : - (forall p:addr. forall q:addr. - (forall a:int. forall b:int [separated(p, a, q, b)]. (separated(p, a, q, - b) -> separated(q, b, p, a)))) - -axiom separated_sym1 : - (forall p:addr. forall q:addr. - (forall a:int. forall b:int [separated(p, a, q, b)]. (separated(q, b, p, - a) -> separated(p, a, q, b)))) - -axiom eqmem_included : - (forall m1:(addr,'a) farray. forall m2:(addr,'a) farray. - (forall p:addr. forall q:addr. - (forall a1:int. forall b:int [eqmem(m1, m2, p, a1), eqmem(m1, m2, q, b)]. - (included(p, a1, q, b) -> (eqmem(m1, m2, q, b) -> eqmem(m1, m2, p, a1)))))) - -axiom eqmem_sym : - (forall m1:(addr,'a) farray. forall m2:(addr,'a) farray. - (forall p:addr. - (forall a1:int. (eqmem(m1, m2, p, a1) -> eqmem(m2, m1, p, a1))))) - -axiom havoc_access : - (forall m0:(addr,'a) farray. forall m1:(addr,'a) farray. - (forall q:addr. forall p:addr. - (forall a1:int. (separated(q, 1, p, a1) -> ((havoc(m0, m1, p, - a1)[q]) = (m1[q])))))) - -axiom havoc_access1 : - (forall m0:(addr,'a) farray. forall m1:(addr,'a) farray. - (forall q:addr. forall p:addr. - (forall a1:int. ((not separated(q, 1, p, a1)) -> ((havoc(m0, m1, p, - a1)[q]) = (m0[q])))))) - -logic int_of_addr : addr -> int - -logic addr_of_int : int -> addr - -logic base_offset : int -> int - -logic base_index : int -> int - -axiom int_of_addr_bijection : - (forall a:int. (int_of_addr(addr_of_int(a)) = a)) - -axiom addr_of_int_bijection : - (forall p:addr. (addr_of_int(int_of_addr(p)) = p)) - -axiom addr_of_null : (int_of_addr(null) = 0) - -axiom base_offset_zero : (base_offset(0) = 0) - -axiom base_offset_inj : (forall i:int. (base_index(base_offset(i)) = i)) - -axiom base_offset_monotonic : - (forall i:int. forall j:int. ((i < j) -> - (base_offset(i) < base_offset(j)))) - diff --git a/src/plugins/wp/share/ergo/Qed.mlw b/src/plugins/wp/share/ergo/Qed.mlw deleted file mode 100644 index 08a3998f07c8d0d923f3ceb0e6b8d3c3344caf67..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/Qed.mlw +++ /dev/null @@ -1,158 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory bool_Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -(** The theory int_Abs_ must be appended to this file*) -(** The theory int_ComputerDivision_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -(** The theory real_RealInfix_ must be appended to this file*) -(** The theory real_FromInt_ must be appended to this file*) -logic match_bool : bool, 'a, 'a -> 'a - -axiom match_bool1 : - (forall p:bool. forall x:'a. forall y:'a [match_bool(p, x, y)]. - (((p = true) and (match_bool(p, x, y) = x)) or ((p = false) and - (match_bool(p, x, y) = y)))) - -logic eqb : 'a, 'a -> bool - -axiom eqb1 : (forall x:'a. forall y:'a. ((eqb(x, y) = true) -> (x = y))) - -axiom eqb2 : (forall x:'a. forall y:'a. ((x = y) -> (eqb(x, y) = true))) - -logic neqb : 'a, 'a -> bool - -axiom neqb1 : - (forall x:'a. forall y:'a. ((neqb(x, y) = true) -> (not (x = y)))) - -axiom neqb2 : - (forall x:'a. forall y:'a. ((not (x = y)) -> (neqb(x, y) = true))) - -logic zlt : int, int -> bool - -logic zleq : int, int -> bool - -axiom zlt1 : (forall x:int. forall y:int. ((zlt(x, y) = true) -> (x < y))) - -axiom zlt2 : (forall x:int. forall y:int. ((x < y) -> (zlt(x, y) = true))) - -axiom zleq1 : (forall x:int. forall y:int. ((zleq(x, y) = true) -> (x <= y))) - -axiom zleq2 : (forall x:int. forall y:int. ((x <= y) -> (zleq(x, y) = true))) - -logic rlt : real, real -> bool - -logic rleq : real, real -> bool - -axiom rlt1 : (forall x:real. forall y:real. ((rlt(x, y) = true) -> (x < y))) - -axiom rlt2 : (forall x:real. forall y:real. ((x < y) -> (rlt(x, y) = true))) - -axiom rleq1 : - (forall x:real. forall y:real. ((rleq(x, y) = true) -> (x <= y))) - -axiom rleq2 : - (forall x:real. forall y:real. ((x <= y) -> (rleq(x, y) = true))) - -function real_of_int(x: int) : real = from_int(x) - -axiom cdiv_cases : - (forall n:int. forall d:int [div(n, d)]. ((0 <= n) -> ((0 < d) -> (div(n, - d) = (n / d))))) - -axiom cdiv_cases1 : - (forall n:int. forall d:int [div(n, d)]. ((n <= 0) -> ((0 < d) -> (div(n, - d) = (-((-n) / d)))))) - -axiom cdiv_cases2 : - (forall n:int. forall d:int [div(n, d)]. ((0 <= n) -> ((d < 0) -> (div(n, - d) = (-(n / (-d))))))) - -axiom cdiv_cases3 : - (forall n:int. forall d:int [div(n, d)]. ((n <= 0) -> ((d < 0) -> (div(n, - d) = ((-n) / (-d)))))) - -axiom cmod_cases : - (forall n:int. forall d:int [mod(n, d)]. ((0 <= n) -> ((0 < d) -> (mod(n, - d) = (n % d))))) - -axiom cmod_cases1 : - (forall n:int. forall d:int [mod(n, d)]. ((n <= 0) -> ((0 < d) -> (mod(n, - d) = (-((-n) % d)))))) - -axiom cmod_cases2 : - (forall n:int. forall d:int [mod(n, d)]. ((0 <= n) -> ((d < 0) -> (mod(n, - d) = (n % (-d)))))) - -axiom cmod_cases3 : - (forall n:int. forall d:int [mod(n, d)]. ((n <= 0) -> ((d < 0) -> (mod(n, - d) = (-((-n) % (-d))))))) - -axiom c_euclidian : - (forall n:int. forall d:int [div(n, d), mod(n, d)]. ((not (d = 0)) -> - (n = ((div(n, d) * d) + mod(n, d))))) - -axiom cmod_remainder : - (forall n:int. forall d:int [mod(n, d)]. ((0 <= n) -> ((0 < d) -> - (0 <= mod(n, d))))) - -axiom cmod_remainder1 : - (forall n:int. forall d:int [mod(n, d)]. ((0 <= n) -> ((0 < d) -> (mod(n, - d) < d)))) - -axiom cmod_remainder2 : - (forall n:int. forall d:int [mod(n, d)]. ((n <= 0) -> ((0 < d) -> - ((-d) < mod(n, d))))) - -axiom cmod_remainder3 : - (forall n:int. forall d:int [mod(n, d)]. ((n <= 0) -> ((0 < d) -> (mod(n, - d) <= 0)))) - -axiom cmod_remainder4 : - (forall n:int. forall d:int [mod(n, d)]. ((0 <= n) -> ((d < 0) -> - (0 <= mod(n, d))))) - -axiom cmod_remainder5 : - (forall n:int. forall d:int [mod(n, d)]. ((0 <= n) -> ((d < 0) -> (mod(n, - d) < (-d))))) - -axiom cmod_remainder6 : - (forall n:int. forall d:int [mod(n, d)]. ((n <= 0) -> ((d < 0) -> - (d < mod(n, d))))) - -axiom cmod_remainder7 : - (forall n:int. forall d:int [mod(n, d)]. ((n <= 0) -> ((d < 0) -> (mod(n, - d) <= 0)))) - -axiom cdiv_neutral : (forall a:int [div(a, 1)]. (div(a, 1) = a)) - -axiom cdiv_inv : - (forall a:int [div(a, a)]. ((not (a = 0)) -> (div(a, a) = 1))) - -axiom cdiv_closed_remainder : - (forall a:int. forall b:int. forall n:int. ((0 <= a) -> ((0 <= b) -> - (((0 <= (b - a)) and ((b - a) < n)) -> ((mod(a,n) = mod(b,n)) -> - (a = b)))))) diff --git a/src/plugins/wp/share/ergo/Square.mlw b/src/plugins/wp/share/ergo/Square.mlw deleted file mode 100644 index 3a1f199e50e96781dfe603cef57352028480a721..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/Square.mlw +++ /dev/null @@ -1,37 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -(** The theory real_RealInfix_ must be appended to this file*) -(** The theory real_Square_ must be appended to this file*) -axiom sqrt_lin1 : (forall x:real [sqrt(x)]. ((1.0 < x) -> (sqrt(x) < x))) - -axiom sqrt_lin0 : - (forall x:real [sqrt(x)]. (((0.0 < x) and (x < 1.0)) -> (x < sqrt(x)))) - -axiom sqrt_0 : (sqrt(0.0) = 0.0) - -axiom sqrt_1 : (sqrt(1.0) = 1.0) - diff --git a/src/plugins/wp/share/ergo/Vlist.mlw b/src/plugins/wp/share/ergo/Vlist.mlw deleted file mode 100644 index c10ced2bdb52503e1331f53739b5074126e748c3..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/Vlist.mlw +++ /dev/null @@ -1,126 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -(** The theory int_Abs_ must be appended to this file*) -(** The theory int_ComputerDivision_ must be appended to this file*) -type 'a list - -logic nil : 'a list - -logic cons : 'a, 'a list -> 'a list - -logic concat : 'a list, 'a list -> 'a list - -logic repeat : 'a list, int -> 'a list - -logic length : 'a list -> int - -logic nth : 'a list, int -> 'a - -axiom length_pos : (forall w:'a list. (0 <= length(w))) - -axiom length_nil : (length((nil : 'a list)) = 0) - -axiom length_nil_bis : - (forall w:'a list. ((length(w) = 0) -> (w = (nil : 'a list)))) - -axiom length_cons : - (forall x:'a. forall w:'a list [length(cons(x, w))]. (length(cons(x, - w)) = (1 + length(w)))) - -axiom length_concat : - (forall u:'a list. forall v:'a list [length(concat(u, v))]. - (length(concat(u, v)) = (length(u) + length(v)))) - -axiom length_repeat : - (forall w:'a list. forall n:int [length(repeat(w, n))]. ((0 <= n) -> - (length(repeat(w, n)) = (n * length(w))))) - -axiom nth_cons : - (forall k:int. forall x:'a. forall w:'a list [nth(cons(x, w), k)]. - ((k = 0) -> (nth(cons(x, w), k) = x))) - -axiom nth_cons1 : - (forall k:int. forall x:'a. forall w:'a list [nth(cons(x, w), k)]. - ((not (k = 0)) -> (nth(cons(x, w), k) = nth(w, (k - 1))))) - -axiom nth_concat : - (forall u:'a list. forall v:'a list. forall k:int [nth(concat(u, v), k)]. - ((k < length(u)) -> (nth(concat(u, v), k) = nth(u, k)))) - -axiom nth_concat1 : - (forall u:'a list. forall v:'a list. forall k:int [nth(concat(u, v), k)]. - ((not (k < length(u))) -> (nth(concat(u, v), k) = nth(v, - (k - length(u)))))) - -axiom nth_repeat : - (forall n:int. forall k:int. forall w:'a list [nth(repeat(w, n), k)]. - (((0 <= k) and (k < (n * length(w)))) -> ((0 < length(w)) -> - (nth(repeat(w, n), k) = nth(w, mod(k, length(w))))))) - -predicate vlist_eq(u: 'a list, v: 'a list) = ((length(u) = length(v)) and - (forall i:int. (((0 <= i) and (i < length(u))) -> (nth(u, i) = nth(v, - i))))) - -axiom extensionality : - (forall u:'a list. forall v:'a list. (vlist_eq(u, v) -> (u = v))) - -axiom rw_nil_concat_left : - (forall w:'a list [concat((nil : 'a list), w)]. (concat((nil : 'a list), - w) = w)) - -axiom rw_nil_concat_right : - (forall w:'a list [concat(w, (nil : 'a list))]. (concat(w, - (nil : 'a list)) = w)) - -axiom rw_nil_repeat : - (forall n:int [repeat((nil : 'a list), n)]. ((0 <= n) -> - (repeat((nil : 'a list), n) = (nil : 'a list)))) - -axiom rw_repeat_zero : - (forall w:'a list [repeat(w, 0)]. (repeat(w, 0) = (nil : 'a list))) - -axiom rw_repeat_one : (forall w:'a list [repeat(w, 1)]. (repeat(w, 1) = w)) - -logic repeat_box : 'a list, int -> 'a list - -axiom rw_repeat_box_unfold : - (forall w:'a list. forall n:int [repeat_box(w, n)]. (repeat_box(w, - n) = repeat(w, n))) - -axiom rw_repeat_plus_box_unfold : - (forall w:'a list. forall a1:int. forall b:int [repeat_box(w, (a1 + b))]. - ((0 <= a1) -> ((0 <= b) -> (repeat_box(w, (a1 + b)) = concat(repeat(w, a1), - repeat(w, b)))))) - -axiom rw_repeat_plus_one_box_unfold : - (forall w:'a list. forall n:int [repeat_box(w, n)]. ((0 < n) -> - (repeat_box(w, n) = concat(repeat(w, (n - 1)), w)))) - -axiom rw_repeat_plus_one_box_unfold1 : - (forall w:'a list. forall n:int [repeat_box(w, n)]. ((0 < n) -> - (repeat_box(w, (n + 1)) = concat(repeat(w, n), w)))) - diff --git a/src/plugins/wp/share/ergo/Vset.mlw b/src/plugins/wp/share/ergo/Vset.mlw deleted file mode 100644 index 250caa049582d78402817b02faedff2b3022772f..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/Vset.mlw +++ /dev/null @@ -1,152 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of WP plug-in of Frama-C. *) -(* *) -(* Copyright (C) 2007-2021 *) -(* CEA (Commissariat a l'energie atomique et aux energies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory bool_Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -type 'a set - -logic empty : 'a set - -logic singleton : 'a -> 'a set - -logic ac union : 'a set, 'a set -> 'a set - -logic ac inter : 'a set, 'a set -> 'a set - -logic member : 'a, 'a set -> prop - -logic member_bool : 'a, 'a set -> bool - -logic range : int, int -> int set - -logic range_sup : int -> int set - -logic range_inf : int -> int set - -logic range_all : int set - -predicate eqset(a: 'a1 set, b: 'a1 set) = - (forall x:'a1. (member(x, a) <-> member(x, b))) - -predicate subset(a: 'a1 set, b: 'a1 set) = - (forall x:'a1. (member(x, a) -> member(x, b))) - -predicate disjoint(a: 'a1 set, b: 'a1 set) = - (forall x:'a1. (member(x, a) -> (not member(x, b)))) - -axiom member_bool1 : - (forall x:'a. - (forall s:'a set [member_bool(x, s)]. (member(x, s) -> (member_bool(x, - s) = true)))) - -axiom member_bool2 : - (forall x:'a. - (forall s:'a set [member_bool(x, s)]. ((not member(x, s)) -> - (member_bool(x, s) = false)))) - -axiom member_empty : - (forall x:'a [member(x, (empty : 'a set))]. (not member(x, - (empty : 'a set)))) - -axiom member_singleton : - (forall x:'a. forall y:'a [member(x, singleton(y))]. (member(x, - singleton(y)) -> (x = y))) - -axiom member_singleton1 : - (forall x:'a. forall y:'a [member(x, singleton(y))]. ((x = y) -> member(x, - singleton(y)))) - -axiom member_union : - (forall x:'a. - (forall a1:'a set. forall b:'a set [member(x, union(a1, b))]. (member(x, - union(a1, b)) -> (member(x, a1) or member(x, b))))) - -axiom member_union1 : - (forall x:'a. - (forall a1:'a set. forall b:'a set [member(x, union(a1, b))]. ((member(x, - a1) or member(x, b)) -> member(x, union(a1, b))))) - -axiom member_inter : - (forall x:'a. - (forall a1:'a set. forall b:'a set [member(x, inter(a1, b))]. (member(x, - inter(a1, b)) -> member(x, a1)))) - -axiom member_inter1 : - (forall x:'a. - (forall a1:'a set. forall b:'a set [member(x, inter(a1, b))]. (member(x, - inter(a1, b)) -> member(x, b)))) - -axiom member_inter2 : - (forall x:'a. - (forall a1:'a set. forall b:'a set [member(x, inter(a1, b))]. ((member(x, - a1) and member(x, b)) -> member(x, inter(a1, b))))) - -axiom union_empty : - (forall a:'a1 set [union(a, (empty : 'a1 set))| union((empty : 'a1 set), - a)]. (union(a, (empty : 'a1 set)) = a)) - -axiom union_empty1 : - (forall a:'a1 set [union(a, (empty : 'a1 set))| union((empty : 'a1 set), - a)]. (union((empty : 'a1 set), a) = a)) - -axiom inter_empty : - (forall a:'a1 set [inter(a, (empty : 'a1 set))| inter((empty : 'a1 set), - a)]. (inter(a, (empty : 'a1 set)) = (empty : 'a1 set))) - -axiom inter_empty1 : - (forall a:'a1 set [inter(a, (empty : 'a1 set))| inter((empty : 'a1 set), - a)]. (inter((empty : 'a1 set), a) = (empty : 'a1 set))) - -axiom member_range : - (forall x:int. forall a:int. forall b:int [member(x, range(a, b))]. - (member(x, range(a, b)) -> (a <= x))) - -axiom member_range1 : - (forall x:int. forall a:int. forall b:int [member(x, range(a, b))]. - (member(x, range(a, b)) -> (x <= b))) - -axiom member_range2 : - (forall x:int. forall a:int. forall b:int [member(x, range(a, b))]. - (((a <= x) and (x <= b)) -> member(x, range(a, b)))) - -axiom member_range_sup : - (forall x:int. forall a:int [member(x, range_sup(a))]. (member(x, - range_sup(a)) -> (a <= x))) - -axiom member_range_sup1 : - (forall x:int. forall a:int [member(x, range_sup(a))]. ((a <= x) -> - member(x, range_sup(a)))) - -axiom member_range_inf : - (forall x:int. forall b:int [member(x, range_inf(b))]. (member(x, - range_inf(b)) -> (x <= b))) - -axiom member_range_inf1 : - (forall x:int. forall b:int [member(x, range_inf(b))]. ((x <= b) -> - member(x, range_inf(b)))) - -axiom member_range_all : - (forall x:int [member(x, range_all)]. member(x, range_all)) - diff --git a/src/plugins/wp/share/ergo/bool.Bool.mlw b/src/plugins/wp/share/ergo/bool.Bool.mlw deleted file mode 100644 index e31c6ffa0dcbc70040a4db98b637938760e52c21..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/bool.Bool.mlw +++ /dev/null @@ -1,27 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -function andb(x: bool, y: bool) : bool = match_bool(x, y, false) - -function orb(x: bool, y: bool) : bool = match_bool(x, true, y) - -function notb(x: bool) : bool = match_bool(x, false, true) - -function xorb(x: bool, y: bool) : bool = match_bool(x, notb(y), y) - -function implb(x: bool, y: bool) : bool = match_bool(x, y, true) - diff --git a/src/plugins/wp/share/ergo/int.Abs.mlw b/src/plugins/wp/share/ergo/int.Abs.mlw deleted file mode 100644 index e03de293a7104e962c3d046e2a4b4c47fb57d572..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/int.Abs.mlw +++ /dev/null @@ -1,35 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -logic abs_int : int -> int - -axiom abs_def : (forall x:int. ((0 <= x) -> (abs_int(x) = x))) - -axiom abs_def1 : (forall x:int. ((not (0 <= x)) -> (abs_int(x) = (-x)))) - -axiom Abs_le : - (forall x:int. forall y:int. ((abs_int(x) <= y) -> ((-y) <= x))) - -axiom Abs_le1 : (forall x:int. forall y:int. ((abs_int(x) <= y) -> (x <= y))) - -axiom Abs_le2 : - (forall x:int. forall y:int. ((((-y) <= x) and (x <= y)) -> - (abs_int(x) <= y))) - -axiom Abs_pos : (forall x:int. (0 <= abs_int(x))) - diff --git a/src/plugins/wp/share/ergo/int.ComputerDivision.mlw b/src/plugins/wp/share/ergo/int.ComputerDivision.mlw deleted file mode 100644 index cc9054d9d97353e3de3697cf7f3421e4eae8c05c..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/int.ComputerDivision.mlw +++ /dev/null @@ -1,49 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -(** The theory int_Abs_ must be appended to this file*) -logic div : int, int -> int - -logic mod : int, int -> int - -axiom Div_bound : - (forall x:int. forall y:int. (((0 <= x) and (0 < y)) -> (0 <= div(x, y)))) - -axiom Div_bound1 : - (forall x:int. forall y:int. (((0 <= x) and (0 < y)) -> (div(x, y) <= x))) - -axiom Div_1 : (forall x:int. (div(x, 1) = x)) - -axiom Mod_1 : (forall x:int. (mod(x, 1) = 0)) - -axiom Div_inf : - (forall x:int. forall y:int. (((0 <= x) and (x < y)) -> (div(x, y) = 0))) - -axiom Mod_inf : - (forall x:int. forall y:int. (((0 <= x) and (x < y)) -> (mod(x, y) = x))) - -axiom Div_mult : - (forall x:int. forall y:int. forall z:int [div(((x * y) + z), x)]. - (((0 < x) and ((0 <= y) and (0 <= z))) -> (div(((x * y) + z), - x) = (y + div(z, x))))) - -axiom Mod_mult : - (forall x:int. forall y:int. forall z:int [mod(((x * y) + z), x)]. - (((0 < x) and ((0 <= y) and (0 <= z))) -> (mod(((x * y) + z), x) = mod(z, - x)))) - diff --git a/src/plugins/wp/share/ergo/int.ComputerOfEuclideanDivision.mlw b/src/plugins/wp/share/ergo/int.ComputerOfEuclideanDivision.mlw deleted file mode 100644 index 4fca9c6c375416d431f1e8a4491f37f58da2b61f..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/int.ComputerOfEuclideanDivision.mlw +++ /dev/null @@ -1,52 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -(** The theory int_Abs_ must be appended to this file*) -(** The theory int_ComputerDivision_ must be appended to this file*) - -axiom cdiv_cases : - (forall n:int. forall d:int [div(n, d)]. ((0 <= n) -> ((0 < d) -> (div(n, - d) = (n / d))))) - -axiom cdiv_cases1 : - (forall n:int. forall d:int [div(n, d)]. ((n <= 0) -> ((0 < d) -> (div(n, - d) = (-((-n) / d)))))) - -axiom cdiv_cases2 : - (forall n:int. forall d:int [div(n, d)]. ((0 <= n) -> ((d < 0) -> (div(n, - d) = (-(n / (-d))))))) - -axiom cdiv_cases3 : - (forall n:int. forall d:int [div(n, d)]. ((n <= 0) -> ((d < 0) -> (div(n, - d) = ((-n) / (-d)))))) - -axiom cmod_cases : - (forall n:int. forall d:int [mod(n, d)]. ((0 <= n) -> ((0 < d) -> (mod(n, - d) = (n % d))))) - -axiom cmod_cases1 : - (forall n:int. forall d:int [mod(n, d)]. ((n <= 0) -> ((0 < d) -> (mod(n, - d) = (-((-n) % d)))))) - -axiom cmod_cases2 : - (forall n:int. forall d:int [mod(n, d)]. ((0 <= n) -> ((d < 0) -> (mod(n, - d) = (n % (-d)))))) - -axiom cmod_cases3 : - (forall n:int. forall d:int [mod(n, d)]. ((n <= 0) -> ((d < 0) -> (mod(n, - d) = (-((-n) % (-d))))))) diff --git a/src/plugins/wp/share/ergo/int.Int.mlw b/src/plugins/wp/share/ergo/int.Int.mlw deleted file mode 100644 index 703c83034f641fe81a193048411fb921648182a2..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/int.Int.mlw +++ /dev/null @@ -1,18 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(* this is a prelude for Alt-Ergo integer arithmetic *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) diff --git a/src/plugins/wp/share/ergo/int.MinMax.mlw b/src/plugins/wp/share/ergo/int.MinMax.mlw deleted file mode 100644 index 5bbc63f78125e8a2f8ae673961a740e801b59582..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/int.MinMax.mlw +++ /dev/null @@ -1,52 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -logic min_int : int, int -> int - -axiom min_def : - (forall x:int. forall y:int. ((x <= y) -> (min_int(x, y) = x))) - -axiom min_def1 : - (forall x:int. forall y:int. ((not (x <= y)) -> (min_int(x, y) = y))) - -logic max_int : int, int -> int - -axiom max_def : - (forall x:int. forall y:int. ((x <= y) -> (max_int(x, y) = y))) - -axiom max_def1 : - (forall x:int. forall y:int. ((not (x <= y)) -> (max_int(x, y) = x))) - -axiom Min_r : (forall x:int. forall y:int. ((y <= x) -> (min_int(x, y) = y))) - -axiom Max_l : (forall x:int. forall y:int. ((y <= x) -> (max_int(x, y) = x))) - -axiom Min_comm : - (forall x:int. forall y:int. (min_int(x, y) = min_int(y, x))) - -axiom Max_comm : - (forall x:int. forall y:int. (max_int(x, y) = max_int(y, x))) - -axiom Min_assoc : - (forall x:int. forall y:int. forall z:int. (min_int(min_int(x, y), - z) = min_int(x, min_int(y, z)))) - -axiom Max_assoc : - (forall x:int. forall y:int. forall z:int. (max_int(max_int(x, y), - z) = max_int(x, max_int(y, z)))) - diff --git a/src/plugins/wp/share/ergo/map.Const.mlw b/src/plugins/wp/share/ergo/map.Const.mlw deleted file mode 100644 index d93ab7e64681b8c8ccecb007ee96567b4b4cec5c..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/map.Const.mlw +++ /dev/null @@ -1,23 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory map_Map_ must be appended to this file*) -logic const : 'b -> ('a,'b) farray - -axiom const_def : - (forall v:'b. forall us:'a. (((const(v) : ('a,'b) farray)[us]) = v)) - diff --git a/src/plugins/wp/share/ergo/map.Map.mlw b/src/plugins/wp/share/ergo/map.Map.mlw deleted file mode 100644 index ddb3b00ec7e09e5b1bafa89f4421e2a37b6ee0ec..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/map.Map.mlw +++ /dev/null @@ -1,17 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) diff --git a/src/plugins/wp/share/ergo/real.Abs.mlw b/src/plugins/wp/share/ergo/real.Abs.mlw deleted file mode 100644 index 1340bfad895cf643a707f95e455b6a88b6fd81a2..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/real.Abs.mlw +++ /dev/null @@ -1,48 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -logic abs_real : real -> real - -axiom abs_def : (forall x:real. ((0.0 <= x) -> (abs_real(x) = x))) - -axiom abs_def1 : (forall x:real. ((not (0.0 <= x)) -> (abs_real(x) = (-x)))) - -axiom Abs_le : - (forall x:real. forall y:real. ((abs_real(x) <= y) -> ((-y) <= x))) - -axiom Abs_le1 : - (forall x:real. forall y:real. ((abs_real(x) <= y) -> (x <= y))) - -axiom Abs_le2 : - (forall x:real. forall y:real. ((((-y) <= x) and (x <= y)) -> - (abs_real(x) <= y))) - -axiom Abs_pos : (forall x:real. (0.0 <= abs_real(x))) - -axiom Abs_sum : - (forall x:real. forall y:real. - (abs_real((x + y)) <= (abs_real(x) + abs_real(y)))) - -axiom Abs_prod : - (forall x:real. forall y:real. - (abs_real((x * y)) = (abs_real(x) * abs_real(y)))) - -axiom triangular_inequality : - (forall x:real. forall y:real. forall z:real. - (abs_real((x - z)) <= (abs_real((x - y)) + abs_real((y - z))))) - diff --git a/src/plugins/wp/share/ergo/real.ExpLog.mlw b/src/plugins/wp/share/ergo/real.ExpLog.mlw deleted file mode 100644 index a600122dfd8185e26c6f1dba6dddfa3decfdb20b..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/real.ExpLog.mlw +++ /dev/null @@ -1,41 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -logic exp : real -> real - -axiom Exp_zero : (exp(0.0) = 1.0) - -axiom Exp_sum : - (forall x:real. forall y:real. (exp((x + y)) = (exp(x) * exp(y)))) - -logic log : real -> real - -axiom Log_one : (log(1.0) = 0.0) - -axiom Log_mul : - (forall x:real. forall y:real. (((0.0 < x) and (0.0 < y)) -> - (log((x * y)) = (log(x) + log(y))))) - -axiom Log_exp : (forall x:real. (log(exp(x)) = x)) - -axiom Exp_log : (forall x:real. ((0.0 < x) -> (exp(log(x)) = x))) - -function log2(x: real) : real = (log(x) / log(2.0)) - -function log10(x: real) : real = (log(x) / log(10.0)) - diff --git a/src/plugins/wp/share/ergo/real.FromInt.mlw b/src/plugins/wp/share/ergo/real.FromInt.mlw deleted file mode 100644 index a1f51341456db10cded4ea61739f8905b0a7722d..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/real.FromInt.mlw +++ /dev/null @@ -1,45 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -logic from_int : int -> real - -axiom Zero : (from_int(0) = 0.0) - -axiom One : (from_int(1) = 1.0) - -axiom Add : - (forall x:int. forall y:int. - (from_int((x + y)) = (from_int(x) + from_int(y)))) - -axiom Sub : - (forall x:int. forall y:int. - (from_int((x - y)) = (from_int(x) - from_int(y)))) - -axiom Mul : - (forall x:int. forall y:int. - (from_int((x * y)) = (from_int(x) * from_int(y)))) - -axiom Neg : (forall x:int. (from_int((-x)) = (-from_int(x)))) - -axiom Injective : - (forall x:int. forall y:int. ((from_int(x) = from_int(y)) -> (x = y))) - -axiom Monotonic : - (forall x:int. forall y:int. ((x <= y) -> (from_int(x) <= from_int(y)))) - diff --git a/src/plugins/wp/share/ergo/real.Hyperbolic.mlw b/src/plugins/wp/share/ergo/real.Hyperbolic.mlw deleted file mode 100644 index 14a08dae73f575e56497771f23b865f90a5a7dfe..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/real.Hyperbolic.mlw +++ /dev/null @@ -1,40 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -(** The theory real_Square_ must be appended to this file*) -(** The theory real_ExpLog_ must be appended to this file*) -function sinh(x: real) : real = (0.5 * (exp(x) - exp((-x)))) - -function cosh(x: real) : real = (0.5 * (exp(x) + exp((-x)))) - -function tanh(x: real) : real = (sinh(x) / cosh(x)) - -function asinh(x: real) : real = log((x + sqrt((sqr(x) + 1.0)))) - -logic acosh : real -> real - -axiom Acosh_def : - (forall x:real. ((1.0 <= x) -> - (acosh(x) = log((x + sqrt((sqr(x) - 1.0))))))) - -logic atanh : real -> real - -axiom Atanh_def : - (forall x:real. ((((- 1.0) < x) and (x < 1.0)) -> - (atanh(x) = (0.5 * log(((1.0 + x) / (1.0 - x))))))) - diff --git a/src/plugins/wp/share/ergo/real.MinMax.mlw b/src/plugins/wp/share/ergo/real.MinMax.mlw deleted file mode 100644 index d1438d67fd2d8b51cba1a8b2f74db3b65b34ec99..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/real.MinMax.mlw +++ /dev/null @@ -1,54 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -logic min_real : real, real -> real - -axiom min_def : - (forall x:real. forall y:real. ((x <= y) -> (min_real(x, y) = x))) - -axiom min_def1 : - (forall x:real. forall y:real. ((not (x <= y)) -> (min_real(x, y) = y))) - -logic max_real : real, real -> real - -axiom max_def : - (forall x:real. forall y:real. ((x <= y) -> (max_real(x, y) = y))) - -axiom max_def1 : - (forall x:real. forall y:real. ((not (x <= y)) -> (max_real(x, y) = x))) - -axiom Min_r : - (forall x:real. forall y:real. ((y <= x) -> (min_real(x, y) = y))) - -axiom Max_l : - (forall x:real. forall y:real. ((y <= x) -> (max_real(x, y) = x))) - -axiom Min_comm : - (forall x:real. forall y:real. (min_real(x, y) = min_real(y, x))) - -axiom Max_comm : - (forall x:real. forall y:real. (max_real(x, y) = max_real(y, x))) - -axiom Min_assoc : - (forall x:real. forall y:real. forall z:real. (min_real(min_real(x, y), - z) = min_real(x, min_real(y, z)))) - -axiom Max_assoc : - (forall x:real. forall y:real. forall z:real. (max_real(max_real(x, y), - z) = max_real(x, max_real(y, z)))) - diff --git a/src/plugins/wp/share/ergo/real.Polar.mlw b/src/plugins/wp/share/ergo/real.Polar.mlw deleted file mode 100644 index 4c953665ad72a84b9b036919327f73bd00a52a2a..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/real.Polar.mlw +++ /dev/null @@ -1,31 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -(** The theory real_Abs_ must be appended to this file*) -(** The theory real_Square_ must be appended to this file*) -(** The theory real_Trigonometry_ must be appended to this file*) -function hypot(x: real, y: real) : real = sqrt((sqr(x) + sqr(y))) - -logic atan2 : real, real -> real - -axiom X_from_polar : - (forall x:real. forall y:real. (x = (hypot(x, y) * cos(atan2(y, x))))) - -axiom Y_from_polar : - (forall x:real. forall y:real. (y = (hypot(x, y) * sin(atan2(y, x))))) - diff --git a/src/plugins/wp/share/ergo/real.PowerReal.mlw b/src/plugins/wp/share/ergo/real.PowerReal.mlw deleted file mode 100644 index 140f336820ee45ac74e03671b18c21d22d4c23c3..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/real.PowerReal.mlw +++ /dev/null @@ -1,50 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -(** The theory int_Exponentiation_ must be appended to this file*) -(** The theory int_Power_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -(** The theory real_FromInt_ must be appended to this file*) -(** The theory real_Square_ must be appended to this file*) -(** The theory real_ExpLog_ must be appended to this file*) -logic pow : real, real -> real - -axiom Pow_def : - (forall x:real. forall y:real. ((0.0 < x) -> (pow(x, - y) = exp((y * log(x)))))) - -axiom Pow_pos : - (forall x:real. forall y:real. ((0.0 < x) -> (0.0 < pow(x, y)))) - -axiom Pow_plus : - (forall x:real. forall y:real. forall z:real. ((0.0 < z) -> (pow(z, - (x + y)) = (pow(z, x) * pow(z, y))))) - -axiom Pow_mult : - (forall x:real. forall y:real. forall z:real. ((0.0 < x) -> (pow(pow(x, - y), z) = pow(x, (y * z))))) - -axiom Pow_x_zero : (forall x:real. ((0.0 < x) -> (pow(x, 0.0) = 1.0))) - -axiom Pow_x_one : (forall x:real. ((0.0 < x) -> (pow(x, 1.0) = x))) - -axiom Pow_one_y : (forall y:real. (pow(1.0, y) = 1.0)) - -axiom Pow_x_two : (forall x:real. ((0.0 < x) -> (pow(x, 2.0) = sqr(x)))) - -axiom Pow_half : (forall x:real. ((0.0 < x) -> (pow(x, 0.5) = sqrt(x)))) diff --git a/src/plugins/wp/share/ergo/real.Real.mlw b/src/plugins/wp/share/ergo/real.Real.mlw deleted file mode 100644 index db80917b1b0b39d54729ec9c3b07a8bbf451311c..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/real.Real.mlw +++ /dev/null @@ -1,42 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(* this is a prelude for Alt-Ergo real arithmetic *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -axiom add_div : - (forall x:real. forall y:real. forall z:real. ((not (z = 0.0)) -> - (((x + y) / z) = ((x / z) + (y / z))))) - -axiom sub_div : - (forall x:real. forall y:real. forall z:real. ((not (z = 0.0)) -> - (((x - y) / z) = ((x / z) - (y / z))))) - -axiom neg_div : - (forall x:real. forall y:real. ((not (y = 0.0)) -> - (((-x) / y) = (-(x / y))))) - -axiom assoc_mul_div : - (forall x:real. forall y:real. forall z:real. ((not (z = 0.0)) -> - (((x * y) / z) = (x * (y / z))))) - -axiom assoc_div_mul : - (forall x:real. forall y:real. forall z:real. (((not (y = 0.0)) and - (not (z = 0.0))) -> (((x / y) / z) = (x / (y * z))))) - -axiom assoc_div_div : - (forall x:real. forall y:real. forall z:real. (((not (y = 0.0)) and - (not (z = 0.0))) -> ((x / (y / z)) = ((x * z) / y)))) - diff --git a/src/plugins/wp/share/ergo/real.RealInfix.mlw b/src/plugins/wp/share/ergo/real.RealInfix.mlw deleted file mode 100644 index 5134839728aff4c170354cdb4d709da7418a7bcf..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/real.RealInfix.mlw +++ /dev/null @@ -1,18 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) diff --git a/src/plugins/wp/share/ergo/real.Square.mlw b/src/plugins/wp/share/ergo/real.Square.mlw deleted file mode 100644 index 4eaec010938bcd45adf0fd9894486a36232fcaf9..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/real.Square.mlw +++ /dev/null @@ -1,36 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -function sqr(x: real) : real = (x * x) - -logic sqrt : real -> real - -axiom Sqrt_positive : (forall x:real. ((0.0 <= x) -> (0.0 <= sqrt(x)))) - -axiom Sqrt_square : (forall x:real. ((0.0 <= x) -> (sqr(sqrt(x)) = x))) - -axiom Square_sqrt : (forall x:real. ((0.0 <= x) -> (sqrt((x * x)) = x))) - -axiom Sqrt_mul : - (forall x:real. forall y:real. (((0.0 <= x) and (0.0 <= y)) -> - (sqrt((x * y)) = (sqrt(x) * sqrt(y))))) - -axiom Sqrt_le : - (forall x:real. forall y:real. (((0.0 <= x) and (x <= y)) -> - (sqrt(x) <= sqrt(y)))) - diff --git a/src/plugins/wp/share/ergo/real.Trigonometry.mlw b/src/plugins/wp/share/ergo/real.Trigonometry.mlw deleted file mode 100644 index 93f357ea6d89eb3cbfb00f057cdcc200f5071c16..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/real.Trigonometry.mlw +++ /dev/null @@ -1,75 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -(** The theory real_Abs_ must be appended to this file*) -(** The theory real_Square_ must be appended to this file*) -logic cos : real -> real - -logic sin : real -> real - -axiom Pythagorean_identity : - (forall x:real. ((sqr(cos(x)) + sqr(sin(x))) = 1.0)) - -axiom Cos_le_one : (forall x:real. (abs_real(cos(x)) <= 1.0)) - -axiom Sin_le_one : (forall x:real. (abs_real(sin(x)) <= 1.0)) - -axiom Cos_0 : (cos(0.0) = 1.0) - -axiom Sin_0 : (sin(0.0) = 0.0) - -logic pi : real - -axiom Pi_double_precision_bounds : (0x1.921fb54442d18p1 < pi) - -axiom Pi_double_precision_bounds1 : (pi < 0x1.921fb54442d19p1) - -axiom Cos_pi : (cos(pi) = (- 1.0)) - -axiom Sin_pi : (sin(pi) = 0.0) - -axiom Cos_pi2 : (cos((0.5 * pi)) = 0.0) - -axiom Sin_pi2 : (sin((0.5 * pi)) = 1.0) - -axiom Cos_plus_pi : (forall x:real. (cos((x + pi)) = (-cos(x)))) - -axiom Sin_plus_pi : (forall x:real. (sin((x + pi)) = (-sin(x)))) - -axiom Cos_plus_pi2 : (forall x:real. (cos((x + (0.5 * pi))) = (-sin(x)))) - -axiom Sin_plus_pi2 : (forall x:real. (sin((x + (0.5 * pi))) = cos(x))) - -axiom Cos_neg : (forall x:real. (cos((-x)) = cos(x))) - -axiom Sin_neg : (forall x:real. (sin((-x)) = (-sin(x)))) - -axiom Cos_sum : - (forall x:real. forall y:real. - (cos((x + y)) = ((cos(x) * cos(y)) - (sin(x) * sin(y))))) - -axiom Sin_sum : - (forall x:real. forall y:real. - (sin((x + y)) = ((sin(x) * cos(y)) + (cos(x) * sin(y))))) - -function tan(x: real) : real = (sin(x) / cos(x)) - -logic atan : real -> real - -axiom Tan_atan : (forall x:real. (tan(atan(x)) = x)) - diff --git a/src/plugins/wp/share/ergo/real.Truncate.mlw b/src/plugins/wp/share/ergo/real.Truncate.mlw deleted file mode 100644 index f86ba0df6fb6717d8d4f9ab7d7182db95c9af023..0000000000000000000000000000000000000000 --- a/src/plugins/wp/share/ergo/real.Truncate.mlw +++ /dev/null @@ -1,73 +0,0 @@ -(**************************************************************************) -(* *) -(* The Why3 Verification Platform / The Why3 Development Team *) -(* Copyright 2010-2019 -- Inria - CNRS - Paris-Sud University *) -(* *) -(* This software is distributed under the terms of the GNU Lesser *) -(* General Public License version 2.1, with the special exception *) -(* on linking described in file LICENSE. *) -(* *) -(* File modified by CEA (Commissariat à l'énergie atomique et aux *) -(* énergies alternatives). *) -(* *) -(**************************************************************************) - -(* this is the prelude for Alt-Ergo, version >= 0.95.2 *) -(** The theory BuiltIn_ must be appended to this file*) -(** The theory Bool_ must be appended to this file*) -(** The theory int_Int_ must be appended to this file*) -(** The theory real_Real_ must be appended to this file*) -(** The theory real_FromInt_ must be appended to this file*) -logic truncate : real -> int - -axiom Truncate_int : (forall i:int. (truncate(from_int(i)) = i)) - -axiom Truncate_down_pos : - (forall x:real. ((0.0 <= x) -> (from_int(truncate(x)) <= x))) - -axiom Truncate_down_pos1 : - (forall x:real. ((0.0 <= x) -> (x < from_int((truncate(x) + 1))))) - -axiom Truncate_up_neg : - (forall x:real. ((x <= 0.0) -> (from_int((truncate(x) - 1)) < x))) - -axiom Truncate_up_neg1 : - (forall x:real. ((x <= 0.0) -> (x <= from_int(truncate(x))))) - -axiom Real_of_truncate : - (forall x:real. ((x - 1.0) <= from_int(truncate(x)))) - -axiom Real_of_truncate1 : - (forall x:real. (from_int(truncate(x)) <= (x + 1.0))) - -axiom Truncate_monotonic : - (forall x:real. forall y:real. ((x <= y) -> (truncate(x) <= truncate(y)))) - -axiom Truncate_monotonic_int1 : - (forall x:real. forall i:int. ((x <= from_int(i)) -> (truncate(x) <= i))) - -axiom Truncate_monotonic_int2 : - (forall x:real. forall i:int. ((from_int(i) <= x) -> (i <= truncate(x)))) - -logic floor : real -> int - -logic ceil : real -> int - -axiom Floor_int : (forall i:int. (floor(from_int(i)) = i)) - -axiom Ceil_int : (forall i:int. (ceil(from_int(i)) = i)) - -axiom Floor_down : (forall x:real. (from_int(floor(x)) <= x)) - -axiom Floor_down1 : (forall x:real. (x < from_int((floor(x) + 1)))) - -axiom Ceil_up : (forall x:real. (from_int((ceil(x) - 1)) < x)) - -axiom Ceil_up1 : (forall x:real. (x <= from_int(ceil(x)))) - -axiom Floor_monotonic : - (forall x:real. forall y:real. ((x <= y) -> (floor(x) <= floor(y)))) - -axiom Ceil_monotonic : - (forall x:real. forall y:real. ((x <= y) -> (ceil(x) <= ceil(y)))) - diff --git a/src/plugins/wp/share/wp.driver b/src/plugins/wp/share/wp.driver index 8024f1f67fbb52a95c4094437906301afe8119ef..92fcd8039c8d53ea7bff2188cad2a46b63075dc5 100644 --- a/src/plugins/wp/share/wp.driver +++ b/src/plugins/wp/share/wp.driver @@ -21,81 +21,40 @@ /**************************************************************************/ library qed: -coq.file += "coqwp/BuiltIn.v"; -coq.file += "coqwp:bool/Bool.v"; -coq.file += "coqwp/HighOrd.v"; -coq.file += "coqwp:int/Int.v"; -coq.file += "coqwp:int/Abs.v"; -coq.file += "coqwp:int/ComputerDivision.v"; -coq.file += "coqwp:int/EuclideanDivision.v"; -coq.file += "coqwp:int/ComputerOfEuclideanDivision.v"; -coq.file += "coqwp:real/Real.v"; -coq.file += "coqwp:real/RealInfix.v"; -coq.file += "coqwp:real/FromInt.v"; -coq.file += "coqwp:map/Map.v"; -coq.file += "coqwp:bool/Bool.v"; -coq.file += "coqwp/Qedlib.v"; -coq.file += "coqwp/Qed.v"; why3.import += "int.Abs:IAbs"; why3.import += "frama_c_wp.qed.Qed"; why3.qualifier := "frama_c_wp.qed"; -altergo.file += "ergo/int.Int.mlw"; -altergo.file += "ergo/int.Abs.mlw"; -altergo.file += "ergo/int.ComputerDivision.mlw"; -altergo.file += "ergo/int.ComputerOfEuclideanDivision.mlw"; -altergo.file += "ergo/real.Real.mlw"; -altergo.file += "ergo/real.RealInfix.mlw"; -altergo.file += "ergo/real.FromInt.mlw"; -altergo.file += "ergo/Qed.mlw"; library const: -coq.file += "coqwp:map/Const.v"; why3.import += "map.Const"; -altergo.file += "ergo/map.Const.mlw"; - -library bool: -altergo.file += "ergo/bool.Bool.mlw"; library minmax_int: -coq.file += "coqwp:int/MinMax.v"; -altergo.file += "ergo/int.MinMax.mlw"; why3.import += "int.MinMax:Ig"; logic integer "\\max"(integer,integer) = commutative:associative:idempotent: - {coq="Zmax";altergo="max_int";why3="Ig.max"}; + {why3="Ig.max"}; logic integer "\\min"(integer,integer) = commutative:associative:idempotent: - {coq="Zmin";altergo="min_int";why3="Ig.min"}; + {why3="Ig.min"}; library minmax_real: -coq.file += "coqwp:real/MinMax.v"; -altergo.file += "ergo/real.MinMax.mlw"; why3.import += "real.MinMax:Rg"; logic real "\\max"(real,real) = commutative:associative:idempotent: - {coq="Rmax";altergo="max_real";why3="Rg.max"}; + {why3="Rg.max"}; logic real "\\min"(real,real) = commutative:associative:idempotent: - {coq="Rmin";altergo="min_real";why3="Rg.min"}; + {why3="Rg.min"}; library cint: -coq.file += "coqwp/Bits.v"; -coq.file += "coqwp/Zbits.v"; -coq.file += "coqwp/Cint.v"; why3.import += "frama_c_wp.cint.Cint"; -altergo.file += "ergo/Cint.mlw"; library cbits: cint logic boolean "bit_test"(integer,integer) := \bit_test_stdlib; -coq.file += "coqwp/Cbits.v"; -altergo.file += "ergo/Cbits.mlw"; why3.import += "frama_c_wp.cbits.Cbits"; library cfloat: cmath sqrt -coq.file += "coqwp:real/Abs.v"; -coq.file += "coqwp/Cfloat.v"; why3.import += "frama_c_wp.cfloat.Cfloat"; -altergo.file += "ergo/Cfloat.mlw"; type "rounding_mode" = "Rounding.mode"; ctor "\\Up"() = "Rounding.RTP"; ctor "\\Down"() = "Rounding.RTN"; @@ -117,69 +76,40 @@ logic float64 "\\round_double"(rounding_mode,real) = "round_double"; library vset: type set = "set"; -coq.file := "coqwp/Vset.v"; why3.import := "vset.Vset"; -altergo.file := "ergo/Vset.mlw"; library vlist: -coq.file := "coqwp/Vlist.v"; why3.import := "frama_c_wp.vlist.Vlist"; -altergo.file := "ergo/Vlist.mlw"; library memory: -coq.file := "coqwp/Memory.v"; why3.import := "frama_c_wp.memory.Memory"; -altergo.file := "ergo/Memory.mlw"; library sqrt: cmath why3.import += "real.Square"; -coq.file += "coqwp/Square.v"; why3.import += "frama_c_wp.cmath.Square"; -altergo.file += "ergo/real.Square.mlw"; -altergo.file += "ergo/Square.mlw"; library exponential: qed why3.import += "real.ExpLog" ; why3.import += "frama_c_wp.cmath.ExpLog" ; -coq.file += "coqwp:real/ExpLog.v" ; -coq.file += "coqwp/Exp.v" ; -altergo.file += "ergo/real.ExpLog.mlw" ; -altergo.file += "ergo/ExpLog.mlw" ; library power: exponential sqrt why3.import += "real.PowerReal" ; -coq.file += "coqwp:int/Exponentiation.v" ; -coq.file += "coqwp:int/Power.v" ; -coq.file += "coqwp:real/PowerReal.v" ; -altergo.file += "ergo/real.PowerReal.mlw" ; library truncate: qed why3.import += "real.Truncate" ; -altergo.file += "ergo/real.Truncate.mlw" ; library cmath: qed why3.import += "real.Abs:RAbs" ; why3.import += "frama_c_wp.cmath.Cmath"; -coq.file += "coqwp:real/Abs.v" ; -coq.file += "coqwp:real/Square.v"; -coq.file += "coqwp/Cmath.v"; -altergo.file += "ergo/real.Abs.mlw" ; -altergo.file += "ergo/Cmath.mlw"; library trigonometry: sqrt cmath why3.import += "real.Trigonometry"; -coq.file += "coqwp:real/Trigonometry.v"; -altergo.file += "ergo/real.Trigonometry.mlw"; library arctrigo: trigonometry why3.import += "frama_c_wp.cmath.ArcTrigo"; -coq.file += "coqwp/ArcTrigo.v"; -altergo.file += "ergo/ArcTrigo.mlw"; library hyperbolic: sqrt exponential why3.import += "real.Hyperbolic"; -altergo.file += "ergo/real.Hyperbolic.mlw"; library polar: sqrt trigonometry why3.import += "real.Polar"; -altergo.file += "ergo/real.Polar.mlw"; diff --git a/src/plugins/wp/tests/test_config_qualif b/src/plugins/wp/tests/test_config_qualif index e92f71e312cedfa7a4d3d316991f7904c32d185d..395f0c6f754e0898ef3c7c570de157da9e5c3b4f 100644 --- a/src/plugins/wp/tests/test_config_qualif +++ b/src/plugins/wp/tests/test_config_qualif @@ -1,3 +1,3 @@ PLUGIN: wp -CMD: @frama-c@ -wp -wp-par 1 -wp-share @PTEST_SHARE_DIR@ -wp-msg-key shell -wp-warn-key pedantic-assigns=inactive -wp-report @PTEST_SUITE_DIR@/../qualif.report -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session -wp-cache-env -wp-cache replay @PTEST_FILE@ -wp-coq-timeout 120 +CMD: @frama-c@ -wp -wp-par 1 -wp-share @PTEST_SHARE_DIR@ -wp-msg-key shell -wp-warn-key pedantic-assigns=inactive -wp-report @PTEST_SUITE_DIR@/../qualif.report -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session -wp-cache-env -wp-cache replay @PTEST_FILE@ OPT: diff --git a/src/plugins/wp/tests/wp/oracle/bug_rte.res.oracle b/src/plugins/wp/tests/wp/oracle/bug_rte.res.oracle index 0de7045f16641d2abf817964791b1e6fa77ad86f..6c94a863a2d3e504a4339ae40a2af5a7d960eddb 100644 --- a/src/plugins/wp/tests/wp/oracle/bug_rte.res.oracle +++ b/src/plugins/wp/tests/wp/oracle/bug_rte.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing bug_rte.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function bug +[rte:annot] annotating function bug ------------------------------------------------------------ Function bug ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp/oracle_qualif/wp_strategy.res.oracle b/src/plugins/wp/tests/wp/oracle_qualif/wp_strategy.res.oracle index dfb0a7c81390b9910d10e663af4cc1bdf6d8774a..da93d6b571bbbf103a94d4fd733264cb8a94e7cb 100644 --- a/src/plugins/wp/tests/wp/oracle_qualif/wp_strategy.res.oracle +++ b/src/plugins/wp/tests/wp/oracle_qualif/wp_strategy.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-model 'Hoare' [...] [kernel] Parsing wp_strategy.c (with preprocessing) -[rte] annotating function bts0513 -[rte] annotating function bts0513_bis +[rte:annot] annotating function bts0513 +[rte:annot] annotating function bts0513_bis [wp] Running WP plugin... [wp] 4 goals scheduled [wp] [Alt-Ergo] Goal hoare_bts0513_ensures_qed_ko_ko1 : Unsuccess diff --git a/src/plugins/wp/tests/wp/stmtcompiler_test.ml b/src/plugins/wp/tests/wp/stmtcompiler_test.ml index e104a2e5c46ffcf840cd1aa225581605ace3763d..0cc749a809c564c2bce0ef192377b3dbacd53066 100644 --- a/src/plugins/wp/tests/wp/stmtcompiler_test.ml +++ b/src/plugins/wp/tests/wp/stmtcompiler_test.ml @@ -50,7 +50,7 @@ let run () = effect = None; } in let po = Wpo.{ - po_gid = ""; po_sid = ""; po_name = ""; po_leg = ""; + po_gid = ""; po_sid = ""; po_name = ""; po_idx = Function(kf, None); po_model = model; po_pid = prop_id; po_formula = Wpo.GoalAnnot vc_annot; diff --git a/src/plugins/wp/tests/wp/stmtcompiler_test_rela.ml b/src/plugins/wp/tests/wp/stmtcompiler_test_rela.ml index 9770e9b429591c4fd76ac2b451398371b0909a64..12849805c20ad3d7c7d73393dae7914bde04163e 100644 --- a/src/plugins/wp/tests/wp/stmtcompiler_test_rela.ml +++ b/src/plugins/wp/tests/wp/stmtcompiler_test_rela.ml @@ -58,7 +58,6 @@ let run () = let annot = Logic_const.new_code_annotation (AAssert ([],pred)) in let po = Wpo.{ po_gid = ""; - po_leg = ""; po_sid = ""; po_name = ""; po_idx = Function(kf, None); @@ -73,7 +72,6 @@ let run () = | h :: _ -> inter_po := Wpo.{ po_gid = ""; - po_leg = ""; po_sid = ""; po_name = ""; po_idx = Function(kf, None); diff --git a/src/plugins/wp/tests/wp_acsl/bitwise.i b/src/plugins/wp/tests/wp_acsl/bitwise.i index a77559d8fc218a0afcc8f465b092337fc99a6594..931ba45bd5a98105e7cac707a1989445b491a1c8 100644 --- a/src/plugins/wp/tests/wp_acsl/bitwise.i +++ b/src/plugins/wp/tests/wp_acsl/bitwise.i @@ -101,7 +101,7 @@ _Bool band_bool(_Bool a, _Bool b) { return (_Bool)(((int)a & (int)b) != 0); } */ _Bool bxor_bool(_Bool a, _Bool b) { return (_Bool)(((int)a ^ (int)b) != 0); } -void lemma(unsigned a, unsigned b) { +void lemma(unsigned a, unsigned b, unsigned k) { //@ check zbit: a1: ~(a + ~a) == 0; //@ check zbit: a2: ~(a | ~a) == 0; //@ check zbit: a3: (a & ~a) == 0; @@ -110,4 +110,23 @@ void lemma(unsigned a, unsigned b) { //@ check (~a --> a) == a; //@ check (a --> ~a) == ~a; //@ check (~a == ~b) ==> (a == b); + + //@ check zbit: a4: ( a & b & 0xFF ) == ( (a & b) % 0x100 ); + /* note: a5 is not simplified because Qed cannot infer that a&b is positive + */ + + //@ check ( a & ((b & 0xFFFF) % 55) & 0xFF ) == ( (a & ((b & 0xFFFF) % 55)) % 0x100 ); + + //@ check zbit: a5: ( a & b & 77 & ((1 << k)-1) ) == ( (a & b & 77) % (1 << k) ); + /* note: a4 is not simplified because Qed cannot infer that k is positive + */ + + //@ check ( a & b & 77 & ((1 << (k & 55))-1) ) == ( (a & b & 77) % (1 << (k & 55)) ); + +} + +//@ ensures \result == (x & 0xFF) ; +unsigned char cast_uchar(int x) { + unsigned char c = x; + return c; } diff --git a/src/plugins/wp/tests/wp_acsl/chunk_typing_usable.i b/src/plugins/wp/tests/wp_acsl/chunk_typing_usable.i index 7f41b168b082e3d19f3540484cd7557b03a9c276..3f4b3a0a572362e7f43dfd91cd9ab2f354642fc1 100644 --- a/src/plugins/wp/tests/wp_acsl/chunk_typing_usable.i +++ b/src/plugins/wp/tests/wp_acsl/chunk_typing_usable.i @@ -2,7 +2,7 @@ OPT: -wp-gen -wp-rte -wp-prover why3 -wp-msg-key print-generated */ /* run.config_qualif - OPT: -wp-rte -wp-coq-script %{dep:@PTEST_DIR@/chunk_typing_usable.script} -wp-prover alt-ergo,native:coq + OPT: -wp-rte -wp-prover alt-ergo */ /*@ diff --git a/src/plugins/wp/tests/wp_acsl/chunk_typing_usable.script b/src/plugins/wp/tests/wp_acsl/chunk_typing_usable.script deleted file mode 100644 index 7e86db5b5e787c3126afb74e22e641ba12b9c35c..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_acsl/chunk_typing_usable.script +++ /dev/null @@ -1,37 +0,0 @@ -(* Generated by Frama-C WP *) - -Goal typed_lemma_provable_lemma. -Hint property,provable_lemma. -Proof. - Import Compound. - - Ltac norm := repeat(match goal with - | [ _ : _ |- context [ (?i + 1 - 1)%Z ]] => replace (i + 1 - 1)%Z with i by omega - | [ _ : _ |- context [ (0 + ?i)%Z ]] => replace (0 + i)%Z with i by omega - | [ _ : _ |- context [ (?i + 0)%Z ]] => replace (i + 0)%Z with i by omega - end). - intros e from cut to. - generalize dependent cut. - induction to using Z_induction with (m := from) ; intros cut mem page Hct Hfc Hm He. - * repeat(rewrite A_Occ.Q_empty ; auto ; try omega). - * assert(EqNeq: { mem.[ (shift_sint32 page to) ] = e } + { mem.[ (shift_sint32 page to) ] <> e }) by - repeat(decide equality). - assert(Cut: (cut < to + 1 \/ cut = to + 1)%Z ) by omega ; inversion Cut as [ Inf | Eq ]. - + inversion_clear EqNeq as [ Eq | Neq ]. - - rewrite <- Eq. - replace (mem .[ shift_sint32 page to]) with (mem .[ shift_sint32 page (to + 1 - 1)]) by (norm ; auto). - rewrite <- A_Occ.Q_is with (i := (to+1)%Z) ; - [ rewrite <- A_Occ.Q_is with (i := (to+1)%Z) | | | | |] ; - norm ; try rewrite Eq ; auto ; try omega. - assert(Simpl: forall x y z : Z, (x + y = z)%Z -> (1 + x + y = 1 + z)%Z) by (intros ; omega). - apply Simpl. - apply IHto ; auto ; omega. - - rewrite <- A_Occ.Q_isnt with (i := (to+1)%Z) ; - [ rewrite <- A_Occ.Q_isnt with (i := (to+1)%Z) | | | | |] ; - norm ; auto ; try omega. - apply IHto ; auto ; omega. - + rewrite Eq. - rewrite A_Occ.Q_empty ; auto ; try omega. -Qed. - - diff --git a/src/plugins/wp/tests/wp_acsl/classify_float.c b/src/plugins/wp/tests/wp_acsl/classify_float.c index 8c4932391e6248f70ca55fb5d29ae2b59cb0d332..dd45b597a3fee283dab0d234f794f6a8ba3cc867 100644 --- a/src/plugins/wp/tests/wp_acsl/classify_float.c +++ b/src/plugins/wp/tests/wp_acsl/classify_float.c @@ -1,7 +1,5 @@ /* run.config_qualif OPT: -wp-prover alt-ergo - OPT: -wp-prover native:alt-ergo - OPT: -wp-prover native:coq -wp-coq-script %{dep:@PTEST_DIR@/classify_float.script} OPT: -wp-model real */ diff --git a/src/plugins/wp/tests/wp_acsl/classify_float.script b/src/plugins/wp/tests/wp_acsl/classify_float.script deleted file mode 100644 index 0b2ca5d38ec8c0ff75950cbbd9cf6debdf566330..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_acsl/classify_float.script +++ /dev/null @@ -1,25 +0,0 @@ -(* Generated by Frama-C WP *) - -Goal typed_lemma_InfN_not_finite. -Hint InfN_not_finite,property. -Proof. -(* auto with zarith. *) -admit. -Admitted. - -Goal typed_lemma_InfP_not_finite. -Hint InfP_not_finite,property. -Proof. -(* auto with zarith. *) -admit. -Admitted. - -Goal typed_lemma_NaN_not_finite. -Hint NaN_not_finite,property. -Proof. -(* auto with zarith. *) -admit. -Admitted. - - - diff --git a/src/plugins/wp/tests/wp_acsl/clusters.i b/src/plugins/wp/tests/wp_acsl/clusters.i index c1a2e71653c867c4a4cb93eba854d6f5f55f69fa..a1e3eba197178d084f1726464472e84aecb4a340 100644 --- a/src/plugins/wp/tests/wp_acsl/clusters.i +++ b/src/plugins/wp/tests/wp_acsl/clusters.i @@ -33,7 +33,7 @@ void mutual_1(unsigned n){ // succeeds termination //@ decreases n ; void mutual_2(unsigned n){ - if(n) mutual_1(n-1); + if(n) mutual_1(n-1); // fails decreases: no decreases for mutual_1 simpl_rf(n); // this does not prevent termination proof } @@ -52,7 +52,7 @@ void fp(void (*)(unsigned), unsigned); //@ decreases n ; void function(unsigned n){ - if(n) fp(&function, n-1); + if(n) fp(&function, n-1); // fails decreases: no decreases for fp } // termination fails : recursion without decreases diff --git a/src/plugins/wp/tests/wp_acsl/decreases.i b/src/plugins/wp/tests/wp_acsl/decreases.i new file mode 100644 index 0000000000000000000000000000000000000000..b4d482fe2e6de2726ac360465942eae7a6a6f128 --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/decreases.i @@ -0,0 +1,113 @@ +/* run.config + OPT: + OPT: -wp-variant-with-terminates +*/ +/* run.config_qualif + OPT: + OPT: -wp-variant-with-terminates +*/ + +/*@ predicate Rel (integer old, integer new) = old > new && 0 <= old; */ + +// Simple recursion + +/*@ terminates \true ; + decreases n ; */ +unsigned fact(unsigned n){ + return n == 0 ? 1 : n * fact(n-1); +} + +/*@ decreases n ; */ +unsigned fails_fact(unsigned n){ + return n == 0 ? 1 : n * fails_fact(n); +} + +/*@ decreases n for Rel ; */ +unsigned facto_gen(unsigned n){ + return n == 0 ? 1 : n * facto_gen(n-1); +} + +/*@ decreases n for Rel ; */ +unsigned fails_facto_gen(unsigned n){ + return n == 0 ? 1 : n * fails_facto_gen(n); +} + +// Simple recursion + termination + +/*@ terminates n >= 0 ; + decreases n ; */ +int fact_i(int n){ + return n == 0 ? 1 : n * fact_i(n-1); +} + +/*@ terminates n >= -1 ; + decreases n for Rel ; */ +int fails_fact_i(int n){ + return n == 0 ? 1 : n * fails_fact_i(n-1); +} + +// Mutual recursion + +void m2(unsigned x); + +/*@ decreases n ; */ +void m1(unsigned n){ + if(n != 0) m2(n-1); +} +/*@ decreases x ; */ +void m2(unsigned x){ + if(x != 0) m1(x-1); + if(x > 10) m2(x-1); + + (void)fact(x); // no verification of decreases here +} + +// Mutual recursion failed + +void missing_2(unsigned n); + +/*@ decreases n ; */ +void missing(unsigned n){ + if(n != 0) missing_2(n-1); + if(n > 30) missing(n-1); +} + +void missing_2(unsigned n){ + if(n != 0) missing(n-1); +} + +// Mutual recursion + termination + +void mt2(unsigned x); + +/*@ terminates \true ; + decreases n ; */ +void mt1(unsigned n){ + if(n != 0) mt2(n-1); +} +/*@ terminates x <= 10 ; + decreases x ; */ +void mt2(unsigned x){ + if(x != 0) mt1(x-1); + if(x > 10) mt2(x-1); // trivial verification of decreases here + + (void)fact(x); // no verification of decreases here +} + +// Mutual recursion + wrong measure + +/*@ predicate Wrong (integer old, integer new) = old > new && 0 <= old; */ + +void mw2(unsigned x); + +/*@ decreases n for Rel ; */ +void mw1(unsigned n){ + if(n != 0) mw2(n-1); // Wrong measure +} +/*@ decreases x for Wrong ; */ +void mw2(unsigned x){ + if(x != 0) mw1(x-1); // Wrong measure + if(x > 10) mw2(x-1); + + (void)fact(x); // no verification of decreases here +} diff --git a/src/plugins/wp/tests/wp_acsl/global_const_dependencies.i b/src/plugins/wp/tests/wp_acsl/global_const_dependencies.i new file mode 100644 index 0000000000000000000000000000000000000000..e87a30d5f0cb74cbcd7715fd9ef15309dc13ab18 --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/global_const_dependencies.i @@ -0,0 +1,7 @@ +static int const A = 1 ; +static int const B = A+1 ; + +int main(void) { + //@ assert B == 2 ; + return 0; +} diff --git a/src/plugins/wp/tests/wp_acsl/oracle/base_offset.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/base_offset.res.oracle index 951ae643d2584fc32706fffa6ebe102eea648066..18e31ad1d27e1b241ddad8e520cf828d900fd814 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/base_offset.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/base_offset.res.oracle @@ -39,6 +39,7 @@ Prove: table_of_base(G_z_33) = table_of_base(G_x_31). ------------------------------------------------------------ Goal Check 'KO' (file base_offset.i, line 30): -Prove: table_of_base(G_y_32) != table_of_base(G_x_31). +Assume { (* Goal *) When: table_of_base(G_y_32) = table_of_base(G_x_31). } +Prove: false. ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle/bitwise.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/bitwise.res.oracle index b9c417ef5fd0e15877f3f89622b9b6966da49a24..836623e5e0d15550cd0a32bf4deff36bab0a32e3 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/bitwise.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/bitwise.res.oracle @@ -153,12 +153,7 @@ Prove: (a = 0) /\ (b = 0). ------------------------------------------------------------ Goal Post-condition for 'true' (file bitwise.i, line 78) in 'bor_bool': -Assume { - Type: is_bool(a) /\ is_bool(b). - (* Pre-condition for 'true' *) - Have: (a = 1) \/ (b = 1). -} -Prove: (a != 0) \/ (b != 0). +Prove: true. ------------------------------------------------------------ ------------------------------------------------------------ @@ -218,6 +213,14 @@ Assume { } Prove: b != a. +------------------------------------------------------------ +------------------------------------------------------------ + Function cast_uchar +------------------------------------------------------------ + +Goal Post-condition (file bitwise.i, line 128) in 'cast_uchar': +Prove: true. + ------------------------------------------------------------ ------------------------------------------------------------ Function lemma @@ -264,6 +267,29 @@ Prove: true. Goal Check (file bitwise.i, line 112): Prove: true. +------------------------------------------------------------ + +Goal Check 'zbit,a4' (file bitwise.i, line 114): +Assume { Type: is_uint32(a) /\ is_uint32(b). } +Prove: (land(a, b) % 256) = land(255, land(a, b)). + +------------------------------------------------------------ + +Goal Check (file bitwise.i, line 118): +Prove: true. + +------------------------------------------------------------ + +Goal Check 'zbit,a5' (file bitwise.i, line 120): +Let x = lsl(1, k). +Assume { Type: is_uint32(a) /\ is_uint32(b) /\ is_uint32(k). } +Prove: (land(77, land(a, b)) % x) = land(77, land(a, land(b, x - 1))). + +------------------------------------------------------------ + +Goal Check (file bitwise.i, line 124): +Prove: true. + ------------------------------------------------------------ ------------------------------------------------------------ Function lshift diff --git a/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle index 39676f8f40fd83404be8fbe8ee04131aaf6f2f0e..4c3b2575f9e95220d9b3b656cd14fa11ed3ed423 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing chunk_typing.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function function +[rte:annot] annotating function function ------------------------------------------------------------ Function function ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing_usable.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing_usable.res.oracle index c3d335a24738053c84d4ae2e5d27fdc1d10e1275..58865eff22dc2d0733b3c82c8270a883ca4ae487 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing_usable.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing_usable.res.oracle @@ -1,8 +1,8 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing chunk_typing_usable.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function usable_axiom -[rte] annotating function usable_lemma +[rte:annot] annotating function usable_axiom +[rte:annot] annotating function usable_lemma [wp] 3 goals scheduled --------------------------------------------- --- Context 'typed_usable_lemma' Cluster 'Chunk' diff --git a/src/plugins/wp/tests/wp_acsl/oracle/clusters.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/clusters.res.oracle index 22929c54f81d6ef7379d18ccc6ed9f303796e754..61a3435b5bbc033d1871b398ddf626f180645976 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/clusters.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/clusters.res.oracle @@ -9,18 +9,12 @@ Missing terminates clause for caller_no_cluster, populates 'terminates \true' [wp] clusters.i:60: Warning: Missing terminates clause for fp, populates 'terminates \true' -[wp] clusters.i:60: Warning: - Unsupported clause @decreases in 'function' (ignored) [wp] clusters.i:54: Warning: Missing terminates clause for function, populates 'terminates \true' [wp] clusters.i:28: Warning: Missing terminates clause for mutual_1, populates 'terminates \true' -[wp] clusters.i:60: Warning: - Unsupported clause @decreases in 'mutual_2' (ignored) [wp] clusters.i:35: Warning: Missing terminates clause for mutual_2, populates 'terminates \true' -[wp] clusters.i:60: Warning: - Unsupported clause @decreases in 'simpl_r' (ignored) [wp] clusters.i:11: Warning: Missing terminates clause for simpl_r, populates 'terminates \true' [wp] clusters.i:15: Warning: @@ -29,8 +23,10 @@ No 'decreases' clause on recursive function 'simpl_rf', cannot prove termination [wp] clusters.i:60: Warning: No 'decreases' clause on recursive function 'mutual_1', cannot prove termination +[wp] clusters.i:36: Warning: No decreases clause for mutual_1 [wp] clusters.i:60: Warning: No 'decreases' clause on recursive function 'fp', cannot prove termination +[wp] clusters.i:55: Warning: No decreases clause for fp ------------------------------------------------------------ Function caller_no_cluster ------------------------------------------------------------ @@ -67,6 +63,16 @@ Prove: true. ------------------------------------------------------------ +Goal Recursion variant: +Call Effect at line 55 +clusters.i:55: warning from wp: + - Warning: Considering non decreasing call, looking for context inconsistency + Reason: No decreases clause for fp +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: false. + +------------------------------------------------------------ + Goal Instance of 'Pre-condition (file clusters.i, line 59) in 'fp'' in 'function' at call 'fp' (file clusters.i, line 55) : Prove: true. @@ -93,6 +99,16 @@ Prove: false. Goal Termination-condition (generated) in 'mutual_2': Prove: true. +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 36 +clusters.i:36: warning from wp: + - Warning: Considering non decreasing call, looking for context inconsistency + Reason: No decreases clause for mutual_1 +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: false. + ------------------------------------------------------------ ------------------------------------------------------------ Function simpl_r @@ -101,6 +117,13 @@ Prove: true. Goal Termination-condition (generated) in 'simpl_r': Prove: true. +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 12 +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: to_uint32(n - 1) < n. + ------------------------------------------------------------ ------------------------------------------------------------ Function simpl_rf diff --git a/src/plugins/wp/tests/wp_acsl/oracle/decreases.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/decreases.0.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..1c0241e1df554d73e7532ba44337a17271391de2 --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/oracle/decreases.0.res.oracle @@ -0,0 +1,242 @@ +# frama-c -wp [...] +[kernel] Parsing decreases.i (no preprocessing) +[wp] Running WP plugin... +[wp] Warning: Missing RTE guards +[wp:hypothesis] decreases.i:108: Warning: 'Rel' relation must be well-founded +[wp] decreases.i:71: Warning: No decreases clause for missing_2 +[wp:hypothesis] decreases.i:108: Warning: 'Wrong' relation must be well-founded +[wp] decreases.i:109: Warning: + On call to mw1, relation (Wrong) does not match caller (Rel) +[wp] decreases.i:105: Warning: + On call to mw2, relation (Rel) does not match caller (Wrong) +------------------------------------------------------------ + Function fact +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 14) in 'fact': +Prove: true. + +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 17 +Assume { Type: is_uint32(n). (* Else *) Have: n != 0. } +Prove: to_uint32(n - 1) < n. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fact_i +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 37) in 'fact_i' (1/2): +Prove: true. + +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 37) in 'fact_i' (2/2): +Call Effect at line 40 +Assume { + Type: is_sint32(n). + (* Goal *) + When: 0 <= n. + (* Else *) + Have: n != 0. +} +Prove: 0 < n. + +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 40 +Assume { Type: is_sint32(n). (* Else *) Have: n != 0. } +Prove: 0 < n. + +------------------------------------------------------------ +------------------------------------------------------------ + Function facto_gen +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 27 +Assume { Type: is_uint32(n). (* Else *) Have: n != 0. } +Prove: P_Rel(n, to_uint32(n - 1)). + +------------------------------------------------------------ +------------------------------------------------------------ + Function fails_fact +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 22 +Assume { Type: is_uint32(n). (* Else *) Have: n != 0. } +Prove: false. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fails_fact_i +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 43) in 'fails_fact_i' (1/2): +Prove: true. + +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 43) in 'fails_fact_i' (2/2): +Call Effect at line 46 +Assume { + Type: is_sint32(n). + (* Goal *) + When: (-1) <= n. + (* Else *) + Have: n != 0. +} +Prove: 0 <= n. + +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 46 +Assume { Type: is_sint32(n). (* Else *) Have: n != 0. } +Prove: P_Rel(n, n - 1). + +------------------------------------------------------------ +------------------------------------------------------------ + Function fails_facto_gen +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 32 +Assume { Type: is_uint32(n). (* Else *) Have: n != 0. } +Prove: P_Rel(n, n). + +------------------------------------------------------------ +------------------------------------------------------------ + Function m1 +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 55 +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: to_uint32(n - 1) < n. + +------------------------------------------------------------ +------------------------------------------------------------ + Function m2 +------------------------------------------------------------ + +Goal Recursion variant (1/2): +Call Effect at line 59 +Assume { Type: is_uint32(x). (* Then *) Have: x != 0. } +Prove: to_uint32(x - 1) < x. + +------------------------------------------------------------ + +Goal Recursion variant (2/2): +Call Effect at line 60 +Assume { Type: is_uint32(x). (* Then *) Have: 11 <= x. } +Prove: to_uint32(x - 1) < x. + +------------------------------------------------------------ +------------------------------------------------------------ + Function missing +------------------------------------------------------------ + +Goal Recursion variant (1/2): +Call Effect at line 71 +decreases.i:71: warning from wp: + - Warning: Considering non decreasing call, looking for context inconsistency + Reason: No decreases clause for missing_2 +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: false. + +------------------------------------------------------------ + +Goal Recursion variant (2/2): +Call Effect at line 72 +Assume { Type: is_uint32(n). (* Then *) Have: 31 <= n. } +Prove: to_uint32(n - 1) < n. + +------------------------------------------------------------ +------------------------------------------------------------ + Function mt1 +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 83) in 'mt1' (1/2): +Prove: true. + +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 83) in 'mt1' (2/2): +Call Effect at line 86 +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: to_uint32(n - 1) <= 10. + +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 86 +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: to_uint32(n - 1) < n. + +------------------------------------------------------------ +------------------------------------------------------------ + Function mt2 +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 88) in 'mt2' (1/2): +Prove: true. + +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 88) in 'mt2' (2/2): +Call Effect at line 92 +Prove: true. + +------------------------------------------------------------ + +Goal Recursion variant (1/2): +Call Effect at line 91 +Assume { Type: is_uint32(x). (* Then *) Have: x != 0. } +Prove: to_uint32(x - 1) < x. + +------------------------------------------------------------ + +Goal Recursion variant (2/2): +Call Effect at line 92 +Assume { Type: is_uint32(x). (* Then *) Have: 11 <= x. } +Prove: to_uint32(x - 1) < x. + +------------------------------------------------------------ +------------------------------------------------------------ + Function mw1 +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 105 +decreases.i:105: warning from wp: + - Warning: Considering non decreasing call, looking for context inconsistency + Reason: On call to mw2, relation (Rel) does not match caller (Wrong) +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: false. + +------------------------------------------------------------ +------------------------------------------------------------ + Function mw2 +------------------------------------------------------------ + +Goal Recursion variant (1/2): +Call Effect at line 109 +decreases.i:109: warning from wp: + - Warning: Considering non decreasing call, looking for context inconsistency + Reason: On call to mw1, relation (Wrong) does not match caller (Rel) +Assume { Type: is_uint32(x). (* Then *) Have: x != 0. } +Prove: false. + +------------------------------------------------------------ + +Goal Recursion variant (2/2): +Call Effect at line 110 +Assume { Type: is_uint32(x). (* Then *) Have: 11 <= x. } +Prove: P_Wrong(x, to_uint32(x - 1)). + +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle/decreases.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/decreases.1.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..503c417688228f6147615930e14def6d47a18997 --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/oracle/decreases.1.res.oracle @@ -0,0 +1,259 @@ +# frama-c -wp [...] +[kernel] Parsing decreases.i (no preprocessing) +[wp] Running WP plugin... +[wp] Warning: Missing RTE guards +[wp:hypothesis] decreases.i:108: Warning: 'Rel' relation must be well-founded +[wp] decreases.i:71: Warning: No decreases clause for missing_2 +[wp:hypothesis] decreases.i:108: Warning: 'Wrong' relation must be well-founded +[wp] decreases.i:109: Warning: + On call to mw1, relation (Wrong) does not match caller (Rel) +[wp] decreases.i:105: Warning: + On call to mw2, relation (Rel) does not match caller (Wrong) +------------------------------------------------------------ + Function fact +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 14) in 'fact': +Prove: true. + +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 17 +Assume { Type: is_uint32(n). (* Else *) Have: n != 0. } +Prove: to_uint32(n - 1) < n. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fact_i +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 37) in 'fact_i' (1/2): +Prove: true. + +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 37) in 'fact_i' (2/2): +Call Effect at line 40 +Assume { + Type: is_sint32(n). + (* Goal *) + When: 0 <= n. + (* Else *) + Have: n != 0. +} +Prove: 0 < n. + +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 40 +Assume { + Type: is_sint32(n). + (* Goal *) + When: 0 <= n. + (* Else *) + Have: n != 0. +} +Prove: 0 < n. + +------------------------------------------------------------ +------------------------------------------------------------ + Function facto_gen +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 27 +Assume { Type: is_uint32(n). (* Else *) Have: n != 0. } +Prove: P_Rel(n, to_uint32(n - 1)). + +------------------------------------------------------------ +------------------------------------------------------------ + Function fails_fact +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 22 +Assume { Type: is_uint32(n). (* Else *) Have: n != 0. } +Prove: false. + +------------------------------------------------------------ +------------------------------------------------------------ + Function fails_fact_i +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 43) in 'fails_fact_i' (1/2): +Prove: true. + +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 43) in 'fails_fact_i' (2/2): +Call Effect at line 46 +Assume { + Type: is_sint32(n). + (* Goal *) + When: (-1) <= n. + (* Else *) + Have: n != 0. +} +Prove: 0 <= n. + +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 46 +Assume { + Type: is_sint32(n). + (* Goal *) + When: (-1) <= n. + (* Else *) + Have: n != 0. +} +Prove: P_Rel(n, n - 1). + +------------------------------------------------------------ +------------------------------------------------------------ + Function fails_facto_gen +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 32 +Assume { Type: is_uint32(n). (* Else *) Have: n != 0. } +Prove: P_Rel(n, n). + +------------------------------------------------------------ +------------------------------------------------------------ + Function m1 +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 55 +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: to_uint32(n - 1) < n. + +------------------------------------------------------------ +------------------------------------------------------------ + Function m2 +------------------------------------------------------------ + +Goal Recursion variant (1/2): +Call Effect at line 59 +Assume { Type: is_uint32(x). (* Then *) Have: x != 0. } +Prove: to_uint32(x - 1) < x. + +------------------------------------------------------------ + +Goal Recursion variant (2/2): +Call Effect at line 60 +Assume { Type: is_uint32(x). (* Then *) Have: 11 <= x. } +Prove: to_uint32(x - 1) < x. + +------------------------------------------------------------ +------------------------------------------------------------ + Function missing +------------------------------------------------------------ + +Goal Recursion variant (1/2): +Call Effect at line 71 +decreases.i:71: warning from wp: + - Warning: Considering non decreasing call, looking for context inconsistency + Reason: No decreases clause for missing_2 +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: false. + +------------------------------------------------------------ + +Goal Recursion variant (2/2): +Call Effect at line 72 +Assume { Type: is_uint32(n). (* Then *) Have: 31 <= n. } +Prove: to_uint32(n - 1) < n. + +------------------------------------------------------------ +------------------------------------------------------------ + Function mt1 +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 83) in 'mt1' (1/2): +Prove: true. + +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 83) in 'mt1' (2/2): +Call Effect at line 86 +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: to_uint32(n - 1) <= 10. + +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 86 +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: to_uint32(n - 1) < n. + +------------------------------------------------------------ +------------------------------------------------------------ + Function mt2 +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 88) in 'mt2' (1/2): +Prove: true. + +------------------------------------------------------------ + +Goal Termination-condition (file decreases.i, line 88) in 'mt2' (2/2): +Call Effect at line 92 +Prove: true. + +------------------------------------------------------------ + +Goal Recursion variant (1/2): +Call Effect at line 91 +Assume { + Type: is_uint32(x). + (* Goal *) + When: x <= 10. + (* Then *) + Have: x != 0. +} +Prove: to_uint32(x - 1) < x. + +------------------------------------------------------------ + +Goal Recursion variant (2/2): +Call Effect at line 92 +Prove: true. + +------------------------------------------------------------ +------------------------------------------------------------ + Function mw1 +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 105 +decreases.i:105: warning from wp: + - Warning: Considering non decreasing call, looking for context inconsistency + Reason: On call to mw2, relation (Rel) does not match caller (Wrong) +Assume { Type: is_uint32(n). (* Then *) Have: n != 0. } +Prove: false. + +------------------------------------------------------------ +------------------------------------------------------------ + Function mw2 +------------------------------------------------------------ + +Goal Recursion variant (1/2): +Call Effect at line 109 +decreases.i:109: warning from wp: + - Warning: Considering non decreasing call, looking for context inconsistency + Reason: On call to mw1, relation (Wrong) does not match caller (Rel) +Assume { Type: is_uint32(x). (* Then *) Have: x != 0. } +Prove: false. + +------------------------------------------------------------ + +Goal Recursion variant (2/2): +Call Effect at line 110 +Assume { Type: is_uint32(x). (* Then *) Have: 11 <= x. } +Prove: P_Wrong(x, to_uint32(x - 1)). + +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle/global_const_dependencies.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/global_const_dependencies.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..bd77fee4cecfe2ccf1421799a799c489c35c07ed --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/oracle/global_const_dependencies.res.oracle @@ -0,0 +1,12 @@ +# frama-c -wp [...] +[kernel] Parsing global_const_dependencies.i (no preprocessing) +[wp] Running WP plugin... +[wp] Warning: Missing RTE guards +------------------------------------------------------------ + Function main +------------------------------------------------------------ + +Goal Assertion (file global_const_dependencies.i, line 5): +Prove: true. + +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle/gnu_zero_array.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/gnu_zero_array.res.oracle index 68ee566322034f899302336760f0949dc31e032a..6ae5795cc78f2501a127a8484ad9e99c848971ef 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/gnu_zero_array.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/gnu_zero_array.res.oracle @@ -1,6 +1,6 @@ # frama-c -wp [...] [kernel] Parsing gnu_zero_array.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [wp] Running WP plugin... [wp] gnu_zero_array.i:14: Warning: Cast with incompatible pointers types (source: sint8*) (target: S*) diff --git a/src/plugins/wp/tests/wp_acsl/oracle/init_value.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/init_value.0.res.oracle index 6071ee00dc7180186cdb32f3429492cf6da89d2b..5c44d6289ed42523daac49a6eff9c7d7982e3573 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/init_value.0.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/init_value.0.res.oracle @@ -140,15 +140,13 @@ Assume { Type: IsArray_sint32(ta1_0) /\ IsArray_sint32(ta2_0) /\ IsArray_sint32(ta3_0). (* Initializer *) - Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))). - (* Initializer *) - Init: ta3_0[1] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))). (* Initializer *) - Init: ta3_0[3] = 1. + Init: x_1 = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (ta3_0[i] = 0))). + Init: x = 1. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta3_0[i] = 0))). + Init: forall i : Z. ((3 <= i) -> ((i <= 3) -> (ta1_0[i] = 0))). (* Initializer *) Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta2_0[i] = 0))). (* Initializer *) @@ -156,13 +154,15 @@ Assume { (* Initializer *) Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta2_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))). + Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))). (* Initializer *) - Init: x_1 = 1. + Init: ta3_0[1] = 1. (* Initializer *) - Init: x = 1. + Init: ta3_0[3] = 1. (* Initializer *) - Init: forall i : Z. ((3 <= i) -> ((i <= 3) -> (ta1_0[i] = 0))). + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (ta3_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta3_0[i] = 0))). } Prove: (x = x_1) /\ (x_3 = x_2). @@ -179,15 +179,13 @@ Assume { Type: IsArray_sint32(ta1_0) /\ IsArray_sint32(ta2_0) /\ IsArray_sint32(ta3_0). (* Initializer *) - Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))). - (* Initializer *) - Init: ta3_0[1] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))). (* Initializer *) - Init: ta3_0[3] = 1. + Init: x_1 = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (ta3_0[i] = 0))). + Init: x = 1. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta3_0[i] = 0))). + Init: forall i : Z. ((3 <= i) -> ((i <= 3) -> (ta1_0[i] = 0))). (* Initializer *) Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta2_0[i] = 0))). (* Initializer *) @@ -195,13 +193,15 @@ Assume { (* Initializer *) Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta2_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))). + Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))). (* Initializer *) - Init: x_1 = 1. + Init: ta3_0[1] = 1. (* Initializer *) - Init: x = 1. + Init: ta3_0[3] = 1. (* Initializer *) - Init: forall i : Z. ((3 <= i) -> ((i <= 3) -> (ta1_0[i] = 0))). + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (ta3_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta3_0[i] = 0))). } Prove: x_2 = 1. @@ -218,15 +218,13 @@ Assume { Type: IsArray_sint32(ta1_0) /\ IsArray_sint32(ta2_0) /\ IsArray_sint32(ta3_0). (* Initializer *) - Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))). - (* Initializer *) - Init: ta3_0[1] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))). (* Initializer *) - Init: ta3_0[3] = 1. + Init: x_1 = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (ta3_0[i] = 0))). + Init: x = 1. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta3_0[i] = 0))). + Init: forall i : Z. ((3 <= i) -> ((i <= 3) -> (ta1_0[i] = 0))). (* Initializer *) Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta2_0[i] = 0))). (* Initializer *) @@ -234,13 +232,15 @@ Assume { (* Initializer *) Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta2_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))). + Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))). (* Initializer *) - Init: x_1 = 1. + Init: ta3_0[1] = 1. (* Initializer *) - Init: x = 1. + Init: ta3_0[3] = 1. (* Initializer *) - Init: forall i : Z. ((3 <= i) -> ((i <= 3) -> (ta1_0[i] = 0))). + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (ta3_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta3_0[i] = 0))). } Prove: x_2 = 1. @@ -257,15 +257,13 @@ Assume { Type: IsArray_sint32(ta1_0) /\ IsArray_sint32(ta2_0) /\ IsArray_sint32(ta3_0). (* Initializer *) - Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))). - (* Initializer *) - Init: ta3_0[1] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))). (* Initializer *) - Init: ta3_0[3] = 1. + Init: x_1 = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (ta3_0[i] = 0))). + Init: x = 1. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta3_0[i] = 0))). + Init: forall i : Z. ((3 <= i) -> ((i <= 3) -> (ta1_0[i] = 0))). (* Initializer *) Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta2_0[i] = 0))). (* Initializer *) @@ -273,13 +271,15 @@ Assume { (* Initializer *) Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta2_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))). + Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))). (* Initializer *) - Init: x_1 = 1. + Init: ta3_0[1] = 1. (* Initializer *) - Init: x = 1. + Init: ta3_0[3] = 1. (* Initializer *) - Init: forall i : Z. ((3 <= i) -> ((i <= 3) -> (ta1_0[i] = 0))). + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (ta3_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (ta3_0[i] = 0))). } Prove: x_2 = 1. @@ -380,1339 +380,1338 @@ Prove: x_3 = 1. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Struct_Simple_a' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } -Prove: x_1 = 2. +Prove: x_5 = 2. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Struct_Simple_b' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. + (* Initializer *) + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: a_6[0] = 1. (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[1] = 2. (* Initializer *) - Init: a_6 = 4. + Init: a_6[2] = 3. (* Initializer *) - Init: x_4 = 0. + Init: a_7 = 4. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[0] = 2. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_4[1] = 3. + Init: a_5[0] = 2. + (* Initializer *) + Init: a_5[1] = 3. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[2] = 4. (* Initializer *) - Init: x_3 = 4. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[0] = 2. + Init: a_4[0] = 2. (* Initializer *) - Init: a_3[1] = 3. + Init: a_4[1] = 3. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[2] = 4. (* Initializer *) Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. - (* Initializer *) - Init: a_2[0] = 2. - (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } -Prove: x = 0. +Prove: x_4 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Simple_Array_0' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } -Prove: x_2 = 1. +Prove: x_3 = 1. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Simple_Array_1' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Let x_6 = t[1]. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(x_6) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(x_6) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. + (* Initializer *) + Init: a_5[0] = 2. + (* Initializer *) + Init: a_5[1] = 3. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[2] = 4. (* Initializer *) - Init: x_3 = 4. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[0] = 2. + Init: a_4[0] = 2. (* Initializer *) - Init: a_3[1] = 3. + Init: a_4[1] = 3. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[2] = 4. (* Initializer *) Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[0] = 2. + Init: a_3[0] = 2. (* Initializer *) - Init: a_2[1] = 3. + Init: a_3[1] = 3. (* Initializer *) - Init: a_2[2] = 4. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: x_2 = 4. (* Initializer *) - Init: a[0] = 1. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a[1] = 2. + Init: a_1[0] = 2. (* Initializer *) - Init: a[2] = 3. + Init: a_1[1] = 3. (* Initializer *) - Init: a_1 = 4. + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). - (* Initializer *) - Init: x_1 = 2. - (* Initializer *) - Init: x = 0. + Init: x = (-1). } Prove: x_6 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,With_Array_Struct_5' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. -Let a_8 = a[5]. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. +Let a_8 = a_6[5]. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a_8). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_8). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } Prove: a_8 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,With_Array_Struct_3' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } -Prove: a_1 = 4. +Prove: a_7 = 4. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Sc_eq' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. + (* Initializer *) + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: a_6[0] = 1. (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[1] = 2. (* Initializer *) - Init: a_6 = 4. + Init: a_6[2] = 3. (* Initializer *) - Init: x_4 = 0. + Init: a_7 = 4. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[0] = 2. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_4[1] = 3. + Init: a_5[0] = 2. + (* Initializer *) + Init: a_5[1] = 3. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[2] = 4. (* Initializer *) - Init: x_3 = 4. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[0] = 2. + Init: a_4[0] = 2. (* Initializer *) - Init: a_3[1] = 3. + Init: a_4[1] = 3. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[2] = 4. (* Initializer *) Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. - (* Initializer *) - Init: a_2[0] = 2. - (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } Prove: EqS3_Sc(sc1_0, sc0_0). ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Sc_t' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. -Let a_8 = a_4[2]. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. +Let a_8 = a_3[2]. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_8) /\ is_sint32(a_6) /\ - is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ is_sint32(a_1) /\ - is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_8) /\ is_sint32(a_2) /\ + is_sint32(a[1]) /\ is_sint32(a[2]) /\ is_sint32(a_7) /\ + is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } Prove: a_8 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Sc_t' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } -Prove: a_6 = 4. +Prove: a_2 = 4. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Sc_c_2' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + (* Initializer *) + Init: a_6[0] = 1. + (* Initializer *) + Init: a_6[1] = 2. + (* Initializer *) + Init: a_6[2] = 3. + (* Initializer *) + Init: a_7 = 4. + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). + (* Initializer *) + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) Init: a_5[0] = 2. (* Initializer *) Init: a_5[1] = 3. (* Initializer *) - Init: a_6 = 4. + Init: a_5[2] = 4. (* Initializer *) - Init: x_4 = 0. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) Init: a_4[0] = 2. (* Initializer *) Init: a_4[1] = 3. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_4[2] = 4. (* Initializer *) - Init: x_3 = 4. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) Init: a_3[0] = 2. (* Initializer *) Init: a_3[1] = 3. (* Initializer *) - Init: a_3[2] = 4. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: x_2 = 4. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[0] = 2. + Init: a_1[0] = 2. (* Initializer *) - Init: a_2[1] = 3. + Init: a_1[1] = 3. (* Initializer *) - Init: a_2[2] = 4. + Init: a_2 = 4. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: x_1 = 0. (* Initializer *) - Init: a[0] = 1. + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: a[1] = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: a[2] = 3. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: a_1 = 4. + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). - (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). - (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). - (* Initializer *) - Init: x_2 = 1. - (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). - (* Initializer *) - Init: x_1 = 2. - (* Initializer *) - Init: x = 0. + Init: x = (-1). } -Prove: x_3 = 4. +Prove: x_2 = 4. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Sc_c_3' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } -Prove: x_4 = 0. +Prove: x_1 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Tab_no_init' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Let x_6 = tab_0[5]. Assume { - Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(x_6) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(x_6) /\ is_sint16(x) /\ + is_sint32(x_3) /\ is_sint32(t[1]) /\ is_sint32(t1_0[4]) /\ + is_sint32(x_5) /\ is_sint32(x_4) /\ is_sint32(x_2) /\ is_sint32(x_1) /\ + is_sint32(a_3[2]) /\ is_sint32(a_2) /\ is_sint32(a[1]) /\ + is_sint32(a[2]) /\ is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } Prove: x_6 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,Tab_todo' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ @@ -1720,330 +1719,330 @@ Assume { (* Goal *) When: (0 <= i) /\ (i <= 31) /\ is_sint32(i). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 31) -> (tab_0[i_1] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 1) -> (a_7[i_1] = 2))). + Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 1) -> (t[i_1] = 0))). (* Initializer *) - Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a_7[i_1] = 0))). + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 3) -> (t1_0[i_1] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i_1 : Z. ((5 <= i_1) -> ((i_1 <= 6) -> (t1_0[i_1] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 4) -> (t1_0[i_1] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i_1 : Z. ((7 <= i_1) -> ((i_1 <= 9) -> (t1_0[i_1] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 9) -> (a_6[i_1] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a_4[i_1] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a_3[i_1] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 9) -> (a[i_1] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 3) -> (t1_0[i_1] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i_1 : Z. ((5 <= i_1) -> ((i_1 <= 6) -> (t1_0[i_1] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 4) -> (t1_0[i_1] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i_1 : Z. ((7 <= i_1) -> ((i_1 <= 9) -> (t1_0[i_1] = 0))). + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 1) -> (a[i_1] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a[i_1] = 0))). (* Initializer *) - Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 1) -> (t[i_1] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 31) -> (tab_0[i_1] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } Prove: tab_0[i] <= 255. ------------------------------------------------------------ Goal Pre-condition 'qed_ok' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. -Let a_8 = a_7[1]. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. +Let a_8 = a[1]. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_8) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a_8) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } Prove: a_8 = 2. ------------------------------------------------------------ Goal Pre-condition 'qed_ok' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. -Let a_8 = a_7[2]. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. +Let a_8 = a[2]. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_8) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a_8) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } Prove: a_8 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ @@ -2051,220 +2050,219 @@ Assume { (* Goal *) When: (0 <= i) /\ (i <= 3). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 31) -> (tab_0[i_1] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 1) -> (a_7[i_1] = 2))). + Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 1) -> (t[i_1] = 0))). (* Initializer *) - Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a_7[i_1] = 0))). + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 3) -> (t1_0[i_1] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i_1 : Z. ((5 <= i_1) -> ((i_1 <= 6) -> (t1_0[i_1] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 4) -> (t1_0[i_1] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i_1 : Z. ((7 <= i_1) -> ((i_1 <= 9) -> (t1_0[i_1] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 9) -> (a_6[i_1] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a_4[i_1] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a_3[i_1] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 9) -> (a[i_1] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 3) -> (t1_0[i_1] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i_1 : Z. ((5 <= i_1) -> ((i_1 <= 6) -> (t1_0[i_1] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 4) -> (t1_0[i_1] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i_1 : Z. ((7 <= i_1) -> ((i_1 <= 9) -> (t1_0[i_1] = 0))). + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 1) -> (a[i_1] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a[i_1] = 0))). (* Initializer *) - Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 1) -> (t[i_1] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 31) -> (tab_0[i_1] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } Prove: t1_0[i] = 1. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,todo' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Let x_6 = t1_0[4]. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(x_6) /\ is_sint32(x_1) /\ is_sint32(x) /\ is_sint32(x_3) /\ - is_sint32(x_4) /\ is_sint32(a_4[2]) /\ is_sint32(a_6) /\ - is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ is_sint32(a_1) /\ - is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ is_sint32(x_6) /\ + is_sint32(x_5) /\ is_sint32(x_4) /\ is_sint32(x_2) /\ is_sint32(x_1) /\ + is_sint32(a_3[2]) /\ is_sint32(a_2) /\ is_sint32(a[1]) /\ + is_sint32(a[2]) /\ is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. + (* Initializer *) + Init: a_5[2] = 4. + (* Initializer *) + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[0] = 2. + Init: a_4[0] = 2. (* Initializer *) - Init: a_3[1] = 3. + Init: a_4[1] = 3. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[2] = 4. (* Initializer *) Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. - (* Initializer *) - Init: a_2[0] = 2. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[1] = 3. + Init: a_3[0] = 2. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[0] = 1. + Init: x_2 = 4. (* Initializer *) - Init: a[1] = 2. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a[2] = 3. + Init: a_1[0] = 2. (* Initializer *) - Init: a_1 = 4. + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: x_2 = 1. - (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } Prove: x_6 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ @@ -2272,110 +2270,110 @@ Assume { (* Goal *) When: (6 <= i) /\ (i <= 6). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 31) -> (tab_0[i_1] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 1) -> (a_7[i_1] = 2))). + Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 1) -> (t[i_1] = 0))). (* Initializer *) - Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a_7[i_1] = 0))). + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 3) -> (t1_0[i_1] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i_1 : Z. ((5 <= i_1) -> ((i_1 <= 6) -> (t1_0[i_1] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 4) -> (t1_0[i_1] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i_1 : Z. ((7 <= i_1) -> ((i_1 <= 9) -> (t1_0[i_1] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 9) -> (a_6[i_1] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a_4[i_1] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. + (* Initializer *) + Init: a_5[2] = 4. + (* Initializer *) + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[0] = 2. + Init: a_4[0] = 2. (* Initializer *) - Init: a_3[1] = 3. + Init: a_4[1] = 3. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[2] = 4. (* Initializer *) Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[0] = 2. + Init: a_3[0] = 2. (* Initializer *) - Init: a_2[1] = 3. + Init: a_3[1] = 3. (* Initializer *) - Init: a_2[2] = 4. + Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a_3[i_1] = 0))). (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: x_2 = 4. (* Initializer *) - Init: a[0] = 1. - (* Initializer *) - Init: a[1] = 2. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a[2] = 3. + Init: a_1[0] = 2. (* Initializer *) - Init: a_1 = 4. + Init: a_1[1] = 3. (* Initializer *) - Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 9) -> (a[i_1] = 0))). + Init: a_2 = 4. (* Initializer *) - Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 3) -> (t1_0[i_1] = 1))). + Init: x_1 = 0. (* Initializer *) - Init: forall i_1 : Z. ((5 <= i_1) -> ((i_1 <= 6) -> (t1_0[i_1] = 2))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 4) -> (t1_0[i_1] = 0))). + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 1) -> (a[i_1] = 2))). (* Initializer *) - Init: forall i_1 : Z. ((7 <= i_1) -> ((i_1 <= 9) -> (t1_0[i_1] = 0))). + Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a[i_1] = 0))). (* Initializer *) - Init: x_2 = 1. - (* Initializer *) - Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 1) -> (t[i_1] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 31) -> (tab_0[i_1] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } Prove: t1_0[i] = 2. ------------------------------------------------------------ Goal Pre-condition 'qed_ok' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ @@ -2383,193 +2381,193 @@ Assume { (* Goal *) When: (7 <= i) /\ (i <= 9). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 31) -> (tab_0[i_1] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 1) -> (a_7[i_1] = 2))). + Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 1) -> (t[i_1] = 0))). (* Initializer *) - Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a_7[i_1] = 0))). + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 3) -> (t1_0[i_1] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i_1 : Z. ((5 <= i_1) -> ((i_1 <= 6) -> (t1_0[i_1] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 4) -> (t1_0[i_1] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i_1 : Z. ((7 <= i_1) -> ((i_1 <= 9) -> (t1_0[i_1] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 9) -> (a_6[i_1] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. + (* Initializer *) + Init: a_5[0] = 2. + (* Initializer *) + Init: a_5[1] = 3. (* Initializer *) - Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a_4[i_1] = 0))). + Init: a_5[2] = 4. (* Initializer *) - Init: x_3 = 4. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[0] = 2. + Init: a_4[0] = 2. (* Initializer *) - Init: a_3[1] = 3. + Init: a_4[1] = 3. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[2] = 4. (* Initializer *) Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. - (* Initializer *) - Init: a_2[0] = 2. - (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a_3[i_1] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 9) -> (a[i_1] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 3) -> (t1_0[i_1] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i_1 : Z. ((5 <= i_1) -> ((i_1 <= 6) -> (t1_0[i_1] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i_1 : Z. ((4 <= i_1) -> ((i_1 <= 4) -> (t1_0[i_1] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i_1 : Z. ((7 <= i_1) -> ((i_1 <= 9) -> (t1_0[i_1] = 0))). + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 1) -> (a[i_1] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i_1 : Z. ((2 <= i_1) -> ((i_1 <= 2) -> (a[i_1] = 0))). (* Initializer *) - Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 1) -> (t[i_1] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 31) -> (tab_0[i_1] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } Prove: t1_0[i] = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ok,direct_init_union' in 'main': -Let x = s.F1_S_b. -Let x_1 = s.F1_S_a. -Let x_2 = t[0]. -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. -Let a_2 = sc0_0.F3_Sc_b. -Let a_3 = sc1_0.F3_Sc_b. -Let x_3 = sc2_0.F3_Sc_c. -Let a_4 = sc2_0.F3_Sc_b. -Let x_4 = sc3_0.F3_Sc_c. -Let a_5 = sc3_0.F3_Sc_b. -Let a_6 = a_5[2]. -Let a_7 = sq0_0.F3_Sc_b. -Let x_5 = u.F4_U_a. +Let x = u.F4_U_a. +Let a = sq0_0.F3_Sc_b. +Let x_1 = sc3_0.F3_Sc_c. +Let a_1 = sc3_0.F3_Sc_b. +Let a_2 = a_1[2]. +Let x_2 = sc2_0.F3_Sc_c. +Let a_3 = sc2_0.F3_Sc_b. +Let a_4 = sc1_0.F3_Sc_b. +Let a_5 = sc0_0.F3_Sc_b. +Let a_6 = st_0.F2_St_tab. +Let a_7 = a_6[3]. +Let x_3 = t[0]. +Let x_4 = s.F1_S_b. +Let x_5 = s.F1_S_a. Assume { Type: IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ is_uint8(tab_0[5]) /\ - is_sint16(x_5) /\ is_sint32(x_2) /\ is_sint32(t[1]) /\ - is_sint32(t1_0[4]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(a_4[2]) /\ - is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ - is_sint32(a_1) /\ is_sint32(a[5]). + is_sint16(x) /\ is_sint32(x_3) /\ is_sint32(t[1]) /\ + is_sint32(t1_0[4]) /\ is_sint32(x_5) /\ is_sint32(x_4) /\ + is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(a_3[2]) /\ + is_sint32(a_2) /\ is_sint32(a[1]) /\ is_sint32(a[2]) /\ + is_sint32(a_7) /\ is_sint32(a_6[5]). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u). (* Initializer *) - Init: x_5 = (-1). + Init: x_5 = 2. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: x_4 = 0. (* Initializer *) - Init: (sq0_0.F3_Sc_a) = 2. + Init: x_3 = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a_7[i] = 2))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_7[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: (sq0_0.F3_Sc_c) = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_5[1] = 3. + Init: a_6[0] = 1. (* Initializer *) - Init: a_6 = 4. + Init: a_6[1] = 2. (* Initializer *) - Init: x_4 = 0. + Init: a_6[2] = 3. (* Initializer *) - Init: (sc2_0.F3_Sc_a) = 1. + Init: a_7 = 4. (* Initializer *) - Init: a_4[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_6[i] = 0))). (* Initializer *) - Init: a_4[1] = 3. + Init: (sc0_0.F3_Sc_a) = 1. (* Initializer *) - Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_4[i] = 0))). + Init: a_5[0] = 2. (* Initializer *) - Init: x_3 = 4. + Init: a_5[1] = 3. (* Initializer *) - Init: (sc1_0.F3_Sc_a) = 1. + Init: a_5[2] = 4. (* Initializer *) - Init: a_3[0] = 2. + Init: (sc0_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_3[1] = 3. + Init: (sc1_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_3[2] = 4. + Init: a_4[0] = 2. (* Initializer *) - Init: (sc1_0.F3_Sc_c) = 5. + Init: a_4[1] = 3. (* Initializer *) - Init: (sc0_0.F3_Sc_a) = 1. + Init: a_4[2] = 4. (* Initializer *) - Init: a_2[0] = 2. + Init: (sc1_0.F3_Sc_c) = 5. (* Initializer *) - Init: a_2[1] = 3. + Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_2[2] = 4. + Init: a_3[0] = 2. (* Initializer *) - Init: (sc0_0.F3_Sc_c) = 5. + Init: a_3[1] = 3. (* Initializer *) - Init: a[0] = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a_3[i] = 0))). (* Initializer *) - Init: a[1] = 2. + Init: x_2 = 4. (* Initializer *) - Init: a[2] = 3. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a_1 = 4. + Init: a_1[0] = 2. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). + Init: a_1[1] = 3. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + Init: a_2 = 4. (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + Init: x_1 = 0. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + Init: (sq0_0.F3_Sc_a) = 2. (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (a[i] = 2))). (* Initializer *) - Init: x_2 = 1. + Init: forall i : Z. ((2 <= i) -> ((i <= 2) -> (a[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (sq0_0.F3_Sc_c) = 2. (* Initializer *) - Init: x_1 = 2. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: x = 0. + Init: x = (-1). } -Prove: x_5 = (-1). +Prove: x = (-1). ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle/init_value.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/init_value.1.res.oracle index f751ef040819de7de6ccd6c0e9e35341c41ceec5..821291b40ccce48898653fb99fb582b4c1811661 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/init_value.1.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/init_value.1.res.oracle @@ -192,34 +192,42 @@ Prove: x = 1. ------------------------------------------------------------ Goal Pre-condition 'qed_ko,Sc_eq_ko' in 'main_ko': -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. +Let a = sc3_0.F3_Sc_b. +Let a_1 = a[2]. Let x = sc2_0.F3_Sc_c. Let a_2 = sc2_0.F3_Sc_b. -Let a_3 = sc3_0.F3_Sc_b. -Let a_4 = a_3[2]. +Let a_3 = st_0.F2_St_tab. +Let a_4 = a_3[3]. Assume { Type: IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ is_uint8(tab_0[5]) /\ is_sint32(t[1]) /\ is_sint32(t1_0[6]) /\ is_sint32(x) /\ - is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\ - is_sint32(a_1). + is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_1) /\ + is_sint32(a_4). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u). (* Initializer *) - Init: (u.F4_U_a) = (-1). + Init: t[0] = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: a_3[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + (* Initializer *) + Init: a_3[0] = 1. (* Initializer *) - Init: a_3[1] = 3. + Init: a_3[1] = 2. + (* Initializer *) + Init: a_3[2] = 3. (* Initializer *) Init: a_4 = 4. (* Initializer *) - Init: (sc3_0.F3_Sc_c) = 0. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_3[i] = 0))). (* Initializer *) Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) @@ -231,61 +239,61 @@ Assume { (* Initializer *) Init: x = 4. (* Initializer *) - Init: a[0] = 1. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a[1] = 2. + Init: a[0] = 2. (* Initializer *) - Init: a[2] = 3. + Init: a[1] = 3. (* Initializer *) Init: a_1 = 4. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). - (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). - (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: (sc3_0.F3_Sc_c) = 0. (* Initializer *) - Init: t[0] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (u.F4_U_a) = (-1). } Prove: EqS3_Sc(sc2_0, sc3_0). ------------------------------------------------------------ Goal Pre-condition 'qed_ko,Sc_t' in 'main_ko': -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. +Let a = sc3_0.F3_Sc_b. +Let a_1 = a[2]. Let x = sc2_0.F3_Sc_c. Let a_2 = sc2_0.F3_Sc_b. -Let a_3 = sc3_0.F3_Sc_b. -Let a_4 = a_3[2]. +Let a_3 = st_0.F2_St_tab. +Let a_4 = a_3[3]. Assume { Type: IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ is_uint8(tab_0[5]) /\ is_sint32(t[1]) /\ is_sint32(t1_0[6]) /\ is_sint32(x) /\ - is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\ - is_sint32(a_1). + is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_1) /\ + is_sint32(a_4). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u). (* Initializer *) - Init: (u.F4_U_a) = (-1). + Init: t[0] = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_3[0] = 2. + Init: a_3[0] = 1. (* Initializer *) - Init: a_3[1] = 3. + Init: a_3[1] = 2. + (* Initializer *) + Init: a_3[2] = 3. (* Initializer *) Init: a_4 = 4. (* Initializer *) - Init: (sc3_0.F3_Sc_c) = 0. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_3[i] = 0))). (* Initializer *) Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) @@ -297,61 +305,61 @@ Assume { (* Initializer *) Init: x = 4. (* Initializer *) - Init: a[0] = 1. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a[1] = 2. + Init: a[0] = 2. (* Initializer *) - Init: a[2] = 3. + Init: a[1] = 3. (* Initializer *) Init: a_1 = 4. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). - (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). - (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: (sc3_0.F3_Sc_c) = 0. (* Initializer *) - Init: t[0] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (u.F4_U_a) = (-1). } -Prove: a_4 = 3. +Prove: a_1 = 3. ------------------------------------------------------------ Goal Pre-condition 'qed_ko,Sc_c_2' in 'main_ko': -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. +Let a = sc3_0.F3_Sc_b. +Let a_1 = a[2]. Let x = sc2_0.F3_Sc_c. Let a_2 = sc2_0.F3_Sc_b. -Let a_3 = sc3_0.F3_Sc_b. -Let a_4 = a_3[2]. +Let a_3 = st_0.F2_St_tab. +Let a_4 = a_3[3]. Assume { Type: IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ is_uint8(tab_0[5]) /\ is_sint32(t[1]) /\ is_sint32(t1_0[6]) /\ is_sint32(x) /\ - is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\ - is_sint32(a_1). + is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_1) /\ + is_sint32(a_4). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u). (* Initializer *) - Init: (u.F4_U_a) = (-1). + Init: t[0] = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: a_3[0] = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + (* Initializer *) + Init: a_3[0] = 1. (* Initializer *) - Init: a_3[1] = 3. + Init: a_3[1] = 2. + (* Initializer *) + Init: a_3[2] = 3. (* Initializer *) Init: a_4 = 4. (* Initializer *) - Init: (sc3_0.F3_Sc_c) = 0. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_3[i] = 0))). (* Initializer *) Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) @@ -363,62 +371,62 @@ Assume { (* Initializer *) Init: x = 4. (* Initializer *) - Init: a[0] = 1. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a[1] = 2. + Init: a[0] = 2. (* Initializer *) - Init: a[2] = 3. + Init: a[1] = 3. (* Initializer *) Init: a_1 = 4. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). - (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). - (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: (sc3_0.F3_Sc_c) = 0. (* Initializer *) - Init: t[0] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (u.F4_U_a) = (-1). } Prove: x = 2. ------------------------------------------------------------ Goal Pre-condition 'qed_ko,Tab_no_init' in 'main_ko': -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. +Let a = sc3_0.F3_Sc_b. +Let a_1 = a[2]. Let x = sc2_0.F3_Sc_c. Let a_2 = sc2_0.F3_Sc_b. -Let a_3 = sc3_0.F3_Sc_b. -Let a_4 = a_3[2]. +Let a_3 = st_0.F2_St_tab. +Let a_4 = a_3[3]. Let x_1 = tab_0[5]. Assume { Type: IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ is_uint8(x_1) /\ is_sint32(t[1]) /\ is_sint32(t1_0[6]) /\ is_sint32(x) /\ - is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\ - is_sint32(a_1). + is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_1) /\ + is_sint32(a_4). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u). (* Initializer *) - Init: (u.F4_U_a) = (-1). + Init: t[0] = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_3[0] = 2. + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + (* Initializer *) + Init: a_3[0] = 1. (* Initializer *) - Init: a_3[1] = 3. + Init: a_3[1] = 2. + (* Initializer *) + Init: a_3[2] = 3. (* Initializer *) Init: a_4 = 4. (* Initializer *) - Init: (sc3_0.F3_Sc_c) = 0. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_3[i] = 0))). (* Initializer *) Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) @@ -430,61 +438,61 @@ Assume { (* Initializer *) Init: x = 4. (* Initializer *) - Init: a[0] = 1. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a[1] = 2. + Init: a[0] = 2. (* Initializer *) - Init: a[2] = 3. + Init: a[1] = 3. (* Initializer *) Init: a_1 = 4. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). - (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). - (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: (sc3_0.F3_Sc_c) = 0. (* Initializer *) - Init: t[0] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (u.F4_U_a) = (-1). } Prove: x_1 = 1. ------------------------------------------------------------ Goal Pre-condition 'qed_ko,With_Array_Struct_3' in 'main_ko': -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. +Let a = sc3_0.F3_Sc_b. +Let a_1 = a[2]. Let x = sc2_0.F3_Sc_c. Let a_2 = sc2_0.F3_Sc_b. -Let a_3 = sc3_0.F3_Sc_b. -Let a_4 = a_3[2]. +Let a_3 = st_0.F2_St_tab. +Let a_4 = a_3[3]. Assume { Type: IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ is_uint8(tab_0[5]) /\ is_sint32(t[1]) /\ is_sint32(t1_0[6]) /\ is_sint32(x) /\ - is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\ - is_sint32(a_1). + is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_1) /\ + is_sint32(a_4). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u). (* Initializer *) - Init: (u.F4_U_a) = (-1). + Init: t[0] = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). (* Initializer *) - Init: a_3[0] = 2. + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + (* Initializer *) + Init: a_3[0] = 1. (* Initializer *) - Init: a_3[1] = 3. + Init: a_3[1] = 2. + (* Initializer *) + Init: a_3[2] = 3. (* Initializer *) Init: a_4 = 4. (* Initializer *) - Init: (sc3_0.F3_Sc_c) = 0. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_3[i] = 0))). (* Initializer *) Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) @@ -496,62 +504,62 @@ Assume { (* Initializer *) Init: x = 4. (* Initializer *) - Init: a[0] = 1. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a[1] = 2. + Init: a[0] = 2. (* Initializer *) - Init: a[2] = 3. + Init: a[1] = 3. (* Initializer *) Init: a_1 = 4. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). - (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). - (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: (sc3_0.F3_Sc_c) = 0. (* Initializer *) - Init: t[0] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (u.F4_U_a) = (-1). } -Prove: a_1 = 3. +Prove: a_4 = 3. ------------------------------------------------------------ Goal Pre-condition 'qed_ko,Simple_Array_1' in 'main_ko': -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. +Let a = sc3_0.F3_Sc_b. +Let a_1 = a[2]. Let x = sc2_0.F3_Sc_c. Let a_2 = sc2_0.F3_Sc_b. -Let a_3 = sc3_0.F3_Sc_b. -Let a_4 = a_3[2]. +Let a_3 = st_0.F2_St_tab. +Let a_4 = a_3[3]. Let x_1 = t[1]. Assume { Type: IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ is_uint8(tab_0[5]) /\ is_sint32(x_1) /\ is_sint32(t1_0[6]) /\ is_sint32(x) /\ - is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\ - is_sint32(a_1). + is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_1) /\ + is_sint32(a_4). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u). (* Initializer *) - Init: (u.F4_U_a) = (-1). + Init: t[0] = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: a_3[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + (* Initializer *) + Init: a_3[0] = 1. (* Initializer *) - Init: a_3[1] = 3. + Init: a_3[1] = 2. + (* Initializer *) + Init: a_3[2] = 3. (* Initializer *) Init: a_4 = 4. (* Initializer *) - Init: (sc3_0.F3_Sc_c) = 0. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_3[i] = 0))). (* Initializer *) Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) @@ -563,62 +571,62 @@ Assume { (* Initializer *) Init: x = 4. (* Initializer *) - Init: a[0] = 1. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a[1] = 2. + Init: a[0] = 2. (* Initializer *) - Init: a[2] = 3. + Init: a[1] = 3. (* Initializer *) Init: a_1 = 4. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). - (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). - (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: (sc3_0.F3_Sc_c) = 0. (* Initializer *) - Init: t[0] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (u.F4_U_a) = (-1). } Prove: x_1 = 1. ------------------------------------------------------------ Goal Pre-condition 'qed_ko,T1_6' in 'main_ko': -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. +Let a = sc3_0.F3_Sc_b. +Let a_1 = a[2]. Let x = sc2_0.F3_Sc_c. Let a_2 = sc2_0.F3_Sc_b. -Let a_3 = sc3_0.F3_Sc_b. -Let a_4 = a_3[2]. +Let a_3 = st_0.F2_St_tab. +Let a_4 = a_3[3]. Let x_1 = t1_0[6]. Assume { Type: IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ is_uint8(tab_0[5]) /\ is_sint32(t[1]) /\ is_sint32(x_1) /\ is_sint32(x) /\ - is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\ - is_sint32(a_1). + is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_1) /\ + is_sint32(a_4). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u). (* Initializer *) - Init: (u.F4_U_a) = (-1). + Init: t[0] = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_3[0] = 2. + Init: a_3[0] = 1. (* Initializer *) - Init: a_3[1] = 3. + Init: a_3[1] = 2. + (* Initializer *) + Init: a_3[2] = 3. (* Initializer *) Init: a_4 = 4. (* Initializer *) - Init: (sc3_0.F3_Sc_c) = 0. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_3[i] = 0))). (* Initializer *) Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) @@ -630,62 +638,62 @@ Assume { (* Initializer *) Init: x = 4. (* Initializer *) - Init: a[0] = 1. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a[1] = 2. + Init: a[0] = 2. (* Initializer *) - Init: a[2] = 3. + Init: a[1] = 3. (* Initializer *) Init: a_1 = 4. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). - (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). - (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: (sc3_0.F3_Sc_c) = 0. (* Initializer *) - Init: t[0] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (u.F4_U_a) = (-1). } Prove: x_1 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ko,indirect_init_union_b' in 'main_ko': -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. +Let a = sc3_0.F3_Sc_b. +Let a_1 = a[2]. Let x = sc2_0.F3_Sc_c. Let a_2 = sc2_0.F3_Sc_b. -Let a_3 = sc3_0.F3_Sc_b. -Let a_4 = a_3[2]. +Let a_3 = st_0.F2_St_tab. +Let a_4 = a_3[3]. Let x_1 = u.F4_U_b. Assume { Type: IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ is_uint8(tab_0[5]) /\ is_sint32(t[1]) /\ is_sint32(t1_0[6]) /\ is_sint32(x) /\ - is_sint64(x_1) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\ - is_sint32(a_1). + is_sint64(x_1) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_1) /\ + is_sint32(a_4). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u). (* Initializer *) - Init: (u.F4_U_a) = (-1). + Init: t[0] = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). (* Initializer *) - Init: a_3[0] = 2. + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + (* Initializer *) + Init: a_3[0] = 1. (* Initializer *) - Init: a_3[1] = 3. + Init: a_3[1] = 2. + (* Initializer *) + Init: a_3[2] = 3. (* Initializer *) Init: a_4 = 4. (* Initializer *) - Init: (sc3_0.F3_Sc_c) = 0. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_3[i] = 0))). (* Initializer *) Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) @@ -697,62 +705,62 @@ Assume { (* Initializer *) Init: x = 4. (* Initializer *) - Init: a[0] = 1. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a[1] = 2. + Init: a[0] = 2. (* Initializer *) - Init: a[2] = 3. + Init: a[1] = 3. (* Initializer *) Init: a_1 = 4. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). - (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). - (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: (sc3_0.F3_Sc_c) = 0. (* Initializer *) - Init: t[0] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (u.F4_U_a) = (-1). } Prove: x_1 = 0. ------------------------------------------------------------ Goal Pre-condition 'qed_ko,indirect_init_union_t' in 'main_ko': -Let a = st_0.F2_St_tab. -Let a_1 = a[3]. +Let a = sc3_0.F3_Sc_b. +Let a_1 = a[2]. Let x = sc2_0.F3_Sc_c. Let a_2 = sc2_0.F3_Sc_b. -Let a_3 = sc3_0.F3_Sc_b. -Let a_4 = a_3[2]. +Let a_3 = st_0.F2_St_tab. +Let a_4 = a_3[3]. Let a_5 = (u.F4_U_t)[0]. Assume { Type: IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ is_uint8(tab_0[5]) /\ is_sint32(t[1]) /\ is_sint32(t1_0[6]) /\ is_sint32(x) /\ - is_sint64(u.F4_U_b) /\ is_sint16(a_5) /\ is_sint32(a_4) /\ - is_sint32(a_1). + is_sint64(u.F4_U_b) /\ is_sint16(a_5) /\ is_sint32(a_1) /\ + is_sint32(a_4). (* Heap *) Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u). (* Initializer *) - Init: (u.F4_U_a) = (-1). + Init: t[0] = 1. (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). + Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). (* Initializer *) - Init: (sc3_0.F3_Sc_a) = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). + (* Initializer *) + Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). + (* Initializer *) + Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). + (* Initializer *) + Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). (* Initializer *) - Init: a_3[0] = 2. + Init: a_3[0] = 1. (* Initializer *) - Init: a_3[1] = 3. + Init: a_3[1] = 2. + (* Initializer *) + Init: a_3[2] = 3. (* Initializer *) Init: a_4 = 4. (* Initializer *) - Init: (sc3_0.F3_Sc_c) = 0. + Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a_3[i] = 0))). (* Initializer *) Init: (sc2_0.F3_Sc_a) = 1. (* Initializer *) @@ -764,27 +772,19 @@ Assume { (* Initializer *) Init: x = 4. (* Initializer *) - Init: a[0] = 1. + Init: (sc3_0.F3_Sc_a) = 1. (* Initializer *) - Init: a[1] = 2. + Init: a[0] = 2. (* Initializer *) - Init: a[2] = 3. + Init: a[1] = 3. (* Initializer *) Init: a_1 = 4. (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 9) -> (a[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((0 <= i) -> ((i <= 3) -> (t1_0[i] = 1))). - (* Initializer *) - Init: forall i : Z. ((5 <= i) -> ((i <= 6) -> (t1_0[i] = 2))). - (* Initializer *) - Init: forall i : Z. ((4 <= i) -> ((i <= 4) -> (t1_0[i] = 0))). - (* Initializer *) - Init: forall i : Z. ((7 <= i) -> ((i <= 9) -> (t1_0[i] = 0))). + Init: (sc3_0.F3_Sc_c) = 0. (* Initializer *) - Init: t[0] = 1. + Init: forall i : Z. ((0 <= i) -> ((i <= 31) -> (tab_0[i] = 0))). (* Initializer *) - Init: forall i : Z. ((0 < i) -> ((i <= 1) -> (t[i] = 0))). + Init: (u.F4_U_a) = (-1). } Prove: a_5 = 0. diff --git a/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.0.res.oracle index 6a67ba4d6fd3c686b990e942e4f7cdbb8bfc8e5a..f178831e9fbcf9a8cdc501abce8026ce0b56fdfe 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.0.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.0.res.oracle @@ -14,13 +14,13 @@ Assume { (* Heap *) Type: region(G_v_20) <= 0. (* Initializer *) - Init: (w.F1_St_a) = 1. - (* Initializer *) - Init: (w.F1_St_b) = 2. - (* Initializer *) Init: Mint_0[shiftfield_F1_St_a(a)] = 1. (* Initializer *) Init: Mint_0[shiftfield_F1_St_b(a)] = 2. + (* Initializer *) + Init: (w.F1_St_a) = 1. + (* Initializer *) + Init: (w.F1_St_b) = 2. } Prove: EqS1_St(a_1, w). @@ -34,13 +34,13 @@ Assume { (* Heap *) Type: region(G_v_20) <= 0. (* Initializer *) - Init: (w.F1_St_a) = 1. - (* Initializer *) - Init: (w.F1_St_b) = 2. - (* Initializer *) Init: Mint_0[shiftfield_F1_St_a(a)] = 1. (* Initializer *) Init: Mint_0[shiftfield_F1_St_b(a)] = 2. + (* Initializer *) + Init: (w.F1_St_a) = 1. + (* Initializer *) + Init: (w.F1_St_b) = 2. } Prove: EqS1_St(a_1, w). diff --git a/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.1.res.oracle index b7feef815a3f905fcf725705b5d54d9097d0d695..5ff5a66df2b2c7bd3f6ac3608a7770e2cb248b79 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.1.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/init_value_mem.1.res.oracle @@ -11,13 +11,13 @@ Goal Post-condition 'P' in 'main': Assume { Type: IsS1_St(v) /\ IsS1_St(w). (* Initializer *) - Init: (w.F1_St_a) = 1. - (* Initializer *) - Init: (w.F1_St_b) = 2. - (* Initializer *) Init: (v.F1_St_a) = 1. (* Initializer *) Init: (v.F1_St_b) = 2. + (* Initializer *) + Init: (w.F1_St_a) = 1. + (* Initializer *) + Init: (w.F1_St_b) = 2. } Prove: EqS1_St(v, w). diff --git a/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle index 2fbf1bb8baf118c8b03fc92bde0a4b04b195f7c6..f327cbfec0e80f5f0ae9ea4f221f2a8c45192f7b 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle @@ -1,12 +1,12 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing opaque_struct.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function assigned_via_pointer -[rte] annotating function assigns -[rte] annotating function assigns_effect -[rte] annotating function chunk_typing -[rte] annotating function initialized_assigns -[rte] annotating function uninitialized_assigns +[rte:annot] annotating function assigned_via_pointer +[rte:annot] annotating function assigns +[rte:annot] annotating function assigns_effect +[rte:annot] annotating function chunk_typing +[rte:annot] annotating function initialized_assigns +[rte:annot] annotating function uninitialized_assigns [kernel:annot:missing-spec] opaque_struct.i:79: Warning: Neither code nor specification for function use, generating default assigns from the prototype ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle index 7b53dd016c6e985880280d6832e73462681e5930..aa0c561557224e54f9a9f121b341bba3912c6f50 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte -wp-no-let [...] [kernel] Parsing struct_fields.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function foo +[rte:annot] annotating function foo [wp] 2 goals scheduled --------------------------------------------- --- Context 'typed_foo' Cluster 'Init_S1_X' diff --git a/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle index de6cb046115000f7caea5d01e4f9026d12394816..d9bd70618f767ce264637cc140e5ee6199eadd5d 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle @@ -2,7 +2,12 @@ [kernel] Parsing terminates_formulae.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards +[wp:hypothesis] terminates_formulae.i:90: Warning: + 'Rel' relation must be well-founded +[wp] [CFG] Goal general_variant_terminates : Valid (Trivial) [wp] [CFG] Goal variant_terminates : Valid (Trivial) +[wp] terminates_formulae.i:90: Warning: + No 'decreases' clause on recursive function 'no_decreases', cannot prove termination ------------------------------------------------------------ Function base_call ------------------------------------------------------------ @@ -57,18 +62,76 @@ Goal Termination-condition (file terminates_formulae.i, line 27) in 'call_same': Call Effect at line 29 Prove: true. +------------------------------------------------------------ +------------------------------------------------------------ + Function decreases +------------------------------------------------------------ + +Goal Termination-condition (file terminates_formulae.i, line 77) in 'decreases': +Prove: true. + +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 80 +Assume { Type: is_uint32(n). (* Goal *) When: P_Q. (* Then *) Have: n != 0. } +Prove: to_uint32(n - 1) < n. + +------------------------------------------------------------ +------------------------------------------------------------ + Function general_decreases +------------------------------------------------------------ + +Goal Termination-condition (file terminates_formulae.i, line 83) in 'general_decreases': +Prove: true. + +------------------------------------------------------------ + +Goal Recursion variant: +Call Effect at line 86 +Assume { Type: is_uint32(n). (* Goal *) When: P_Q. (* Then *) Have: n != 0. } +Prove: P_Rel(n, to_uint32(n - 1)). + +------------------------------------------------------------ +------------------------------------------------------------ + Function general_variant +------------------------------------------------------------ + +Goal Loop assigns (file terminates_formulae.i, line 66): +Prove: true. + +------------------------------------------------------------ + +Goal Follows relation Loop variant at loop (file terminates_formulae.i, line 68): +Assume { Type: is_uint32(x). (* Goal *) When: P_Q. (* Then *) Have: 0 < x. } +Prove: P_Rel(x, to_uint32(x - 1)). + +------------------------------------------------------------ +------------------------------------------------------------ + Function no_decreases +------------------------------------------------------------ + +Goal Termination-condition (file terminates_formulae.i, line 89) in 'no_decreases' (1/2): +Prove: true. + +------------------------------------------------------------ + +Goal Termination-condition (file terminates_formulae.i, line 89) in 'no_decreases' (2/2): +Call Result at line 92 +Prove: false. + ------------------------------------------------------------ ------------------------------------------------------------ Function no_variant ------------------------------------------------------------ -Goal Termination-condition (file terminates_formulae.i, line 62) in 'no_variant': -Effect at line 65 +Goal Termination-condition (file terminates_formulae.i, line 71) in 'no_variant': +Effect at line 74 Prove: !P_Q. ------------------------------------------------------------ -Goal Loop assigns (file terminates_formulae.i, line 64): +Goal Loop assigns (file terminates_formulae.i, line 73): Prove: true. ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise.res.oracle index c821ec7b2ef31c0fcd7daf7cbdb2d2f45ba518bd..97ca9dc0b2e4a746c0afb700024fa8aeabc3f991 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise.res.oracle @@ -2,7 +2,7 @@ [kernel] Parsing bitwise.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards -[wp] 35 goals scheduled +[wp] 38 goals scheduled [wp] [Qed] Goal typed_band_ensures : Valid [wp] [Qed] Goal typed_band_ensures_band0 : Valid [wp] [Qed] Goal typed_band_bit0_ensures_band1 : Valid @@ -27,7 +27,7 @@ [wp] [Qed] Goal typed_lshift_shift2_ensures_lsl3 : Valid [wp] [Qed] Goal typed_rshift_ensures : Valid [wp] [Qed] Goal typed_rshift_shift1_ensures_lsr1 : Valid -[wp] [Alt-Ergo] Goal typed_bor_bool_true_ensures : Valid +[wp] [Qed] Goal typed_bor_bool_true_ensures : Valid [wp] [Alt-Ergo] Goal typed_bor_bool_false_ensures : Valid [wp] [Qed] Goal typed_band_bool_true_ensures : Valid [wp] [Alt-Ergo] Goal typed_band_bool_false_ensures : Valid @@ -38,9 +38,12 @@ [wp] [Qed] Goal typed_lemma_check_3 : Valid [wp] [Qed] Goal typed_lemma_check_4 : Valid [wp] [Qed] Goal typed_lemma_check_5 : Valid -[wp] Proved goals: 35 / 35 - Qed: 31 - Alt-Ergo: 4 +[wp] [Qed] Goal typed_lemma_check_6 : Valid +[wp] [Qed] Goal typed_lemma_check_7 : Valid +[wp] [Qed] Goal typed_cast_uchar_ensures : Valid +[wp] Proved goals: 38 / 38 + Qed: 35 + Alt-Ergo: 3 ------------------------------------------------------------ Functions WP Alt-Ergo Total Success band 8 - 8 100% @@ -49,8 +52,9 @@ bnot 1 - 1 100% lshift 4 - 4 100% rshift 2 - 2 100% - bor_bool - 2 2 100% + bor_bool 1 1 2 100% band_bool 1 1 2 100% bxor_bool 1 1 2 100% - lemma 5 - 5 100% + lemma 7 - 7 100% + cast_uchar 1 - 1 100% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing.res.oracle index 768556112b11b4547149a138b6bbc0825804aa50..98bcd99641039e586c9d25533d31f4c0c9f640af 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing chunk_typing.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function function +[rte:annot] annotating function function [wp] 39 goals scheduled [wp] [Alt-Ergo] Goal typed_function_ensures : Valid [wp] [Alt-Ergo] Goal typed_function_loop_invariant_preserved : Valid diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing_usable.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing_usable.res.oracle index d076d76ed0ca7aae9c361b7cb65df1b03f11b9d5..5569268205364aef072e778f13495cf836d3c0b8 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing_usable.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/chunk_typing_usable.res.oracle @@ -1,21 +1,18 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing chunk_typing_usable.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function usable_axiom -[rte] annotating function usable_lemma -[wp] Warning: native support for coq is deprecated, use tip instead +[rte:annot] annotating function usable_axiom +[rte:annot] annotating function usable_lemma [wp] 3 goals scheduled -[wp] [Coq] Goal typed_lemma_provable_lemma : Saved script -[wp] [Coq (native)] Goal typed_lemma_provable_lemma : Valid +[wp] [Alt-Ergo] Goal typed_lemma_provable_lemma : Unsuccess [wp] [Alt-Ergo] Goal typed_usable_axiom_ensures : Valid [wp] [Alt-Ergo] Goal typed_usable_lemma_ensures : Valid -[wp] Proved goals: 3 / 3 +[wp] Proved goals: 2 / 3 Qed: 0 - Coq (native): 1 Alt-Ergo: 2 (unsuccess: 1) ------------------------------------------------------------ Axiomatics WP Alt-Ergo Total Success - Lemma - - 1 100% + Lemma - - 1 0.0% ------------------------------------------------------------ Functions WP Alt-Ergo Total Success usable_axiom - 1 1 100% diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.1.res.oracle index efbf0e0a5e995775beccb153f9ac586f1301faaf..d56892bed73e2320f69ba98f7d23a947f7420d22 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.1.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.1.res.oracle @@ -1,15 +1,13 @@ -# frama-c -wp [...] +# frama-c -wp -wp-model 'Typed (Real)' [...] [kernel] Parsing classify_float.c (with preprocessing) [wp] Running WP plugin... -[wp] Warning: native support for alt-ergo is deprecated, use why3 instead [wp] 3 goals scheduled -[wp] [Alt-Ergo (native)] Goal typed_lemma_InfN_not_finite : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_InfP_not_finite : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_NaN_not_finite : Valid +[wp] [Qed] Goal typed_real_lemma_InfN_not_finite : Valid +[wp] [Qed] Goal typed_real_lemma_InfP_not_finite : Valid +[wp] [Qed] Goal typed_real_lemma_NaN_not_finite : Valid [wp] Proved goals: 3 / 3 - Qed: 0 - Alt-Ergo (native): 3 + Qed: 3 ------------------------------------------------------------ Axiomatics WP Alt-Ergo Total Success - Lemma - - 3 100% + Lemma 3 - 3 100% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.2.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.2.res.oracle index 8d89bf6103e89d700c551ea565d3cd4a814e3d35..d56892bed73e2320f69ba98f7d23a947f7420d22 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.2.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.2.res.oracle @@ -1,18 +1,13 @@ -# frama-c -wp [...] +# frama-c -wp -wp-model 'Typed (Real)' [...] [kernel] Parsing classify_float.c (with preprocessing) [wp] Running WP plugin... -[wp] Warning: native support for coq is deprecated, use tip instead [wp] 3 goals scheduled -[wp] [Coq] Goal typed_lemma_InfN_not_finite : Saved script -[wp] [Coq (native)] Goal typed_lemma_InfN_not_finite : Valid -[wp] [Coq] Goal typed_lemma_InfP_not_finite : Saved script -[wp] [Coq (native)] Goal typed_lemma_InfP_not_finite : Valid -[wp] [Coq] Goal typed_lemma_NaN_not_finite : Saved script -[wp] [Coq (native)] Goal typed_lemma_NaN_not_finite : Valid +[wp] [Qed] Goal typed_real_lemma_InfN_not_finite : Valid +[wp] [Qed] Goal typed_real_lemma_InfP_not_finite : Valid +[wp] [Qed] Goal typed_real_lemma_NaN_not_finite : Valid [wp] Proved goals: 3 / 3 - Qed: 0 - Coq (native): 3 + Qed: 3 ------------------------------------------------------------ Axiomatics WP Alt-Ergo Total Success - Lemma - - 3 100% + Lemma 3 - 3 100% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.3.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.3.res.oracle deleted file mode 100644 index d56892bed73e2320f69ba98f7d23a947f7420d22..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/classify_float.3.res.oracle +++ /dev/null @@ -1,13 +0,0 @@ -# frama-c -wp -wp-model 'Typed (Real)' [...] -[kernel] Parsing classify_float.c (with preprocessing) -[wp] Running WP plugin... -[wp] 3 goals scheduled -[wp] [Qed] Goal typed_real_lemma_InfN_not_finite : Valid -[wp] [Qed] Goal typed_real_lemma_InfP_not_finite : Valid -[wp] [Qed] Goal typed_real_lemma_NaN_not_finite : Valid -[wp] Proved goals: 3 / 3 - Qed: 3 ------------------------------------------------------------- - Axiomatics WP Alt-Ergo Total Success - Lemma 3 - 3 100% ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/clusters.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/clusters.res.oracle index 8e6f2960697c5548bc3cb90393df4ce92cd713b9..b7b48261bc0d1f853f89e289774ccae1298e46bd 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/clusters.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/clusters.res.oracle @@ -9,18 +9,12 @@ Missing terminates clause for caller_no_cluster, populates 'terminates \true' [wp] clusters.i:60: Warning: Missing terminates clause for fp, populates 'terminates \true' -[wp] clusters.i:60: Warning: - Unsupported clause @decreases in 'function' (ignored) [wp] clusters.i:54: Warning: Missing terminates clause for function, populates 'terminates \true' [wp] clusters.i:28: Warning: Missing terminates clause for mutual_1, populates 'terminates \true' -[wp] clusters.i:60: Warning: - Unsupported clause @decreases in 'mutual_2' (ignored) [wp] clusters.i:35: Warning: Missing terminates clause for mutual_2, populates 'terminates \true' -[wp] clusters.i:60: Warning: - Unsupported clause @decreases in 'simpl_r' (ignored) [wp] clusters.i:11: Warning: Missing terminates clause for simpl_r, populates 'terminates \true' [wp] clusters.i:15: Warning: @@ -29,31 +23,36 @@ No 'decreases' clause on recursive function 'simpl_rf', cannot prove termination [wp] clusters.i:60: Warning: No 'decreases' clause on recursive function 'mutual_1', cannot prove termination +[wp] clusters.i:36: Warning: No decreases clause for mutual_1 [wp] clusters.i:60: Warning: No 'decreases' clause on recursive function 'fp', cannot prove termination -[wp] 12 goals scheduled +[wp] clusters.i:55: Warning: No decreases clause for fp +[wp] 15 goals scheduled [wp] [Qed] Goal typed_simpl_r_terminates : Valid +[wp] [Alt-Ergo] Goal typed_simpl_r_variant : Valid [wp] [Qed] Goal typed_simpl_rf_terminates_part1 : Valid [wp] [Alt-Ergo] Goal typed_simpl_rf_terminates_part2 : Unsuccess [wp] [Qed] Goal typed_mutual_1_terminates_part1 : Valid [wp] [Alt-Ergo] Goal typed_mutual_1_terminates_part2 : Unsuccess [wp] [Qed] Goal typed_mutual_2_terminates : Valid +[wp] [Alt-Ergo] Goal typed_mutual_2_variant : Unsuccess (Degenerated) [wp] [Qed] Goal typed_caller_no_cluster_terminates : Valid [wp] [Qed] Goal typed_fp_call_point_function_s41 : Valid [wp] [Qed] Goal typed_fp_terminates_part1 : Valid [wp] [Alt-Ergo] Goal typed_fp_terminates_part2 : Unsuccess [wp] [Qed] Goal typed_function_terminates : Valid +[wp] [Alt-Ergo] Goal typed_function_variant : Unsuccess (Degenerated) [wp] [Qed] Goal typed_function_call_fp_requires : Valid -[wp] Proved goals: 10 / 13 +[wp] Proved goals: 11 / 16 Qed: 9 - Alt-Ergo: 0 (unsuccess: 3) + Alt-Ergo: 1 (unsuccess: 5) ------------------------------------------------------------ Functions WP Alt-Ergo Total Success - simpl_r 1 - 1 100% + simpl_r 1 1 2 100% simpl_rf 1 - 2 50.0% mutual_1 1 - 2 50.0% - mutual_2 1 - 1 100% + mutual_2 1 - 2 50.0% caller_no_cluster 1 - 1 100% fp 2 - 3 66.7% - function 2 - 2 100% + function 2 - 3 66.7% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.0.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..62e79688690128fd49abbc91e54a2e4c560df53d --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.0.res.oracle @@ -0,0 +1,57 @@ +# frama-c -wp [...] +[kernel] Parsing decreases.i (no preprocessing) +[wp] Running WP plugin... +[wp] Warning: Missing RTE guards +[wp:hypothesis] decreases.i:108: Warning: 'Rel' relation must be well-founded +[wp] decreases.i:71: Warning: No decreases clause for missing_2 +[wp:hypothesis] decreases.i:108: Warning: 'Wrong' relation must be well-founded +[wp] decreases.i:109: Warning: + On call to mw1, relation (Wrong) does not match caller (Rel) +[wp] decreases.i:105: Warning: + On call to mw2, relation (Rel) does not match caller (Wrong) +[wp] 26 goals scheduled +[wp] [Qed] Goal typed_fact_terminates : Valid +[wp] [Alt-Ergo] Goal typed_fact_variant : Valid +[wp] [Alt-Ergo] Goal typed_fails_fact_variant : Unsuccess +[wp] [Alt-Ergo] Goal typed_facto_gen_variant : Valid +[wp] [Alt-Ergo] Goal typed_fails_facto_gen_variant : Unsuccess +[wp] [Qed] Goal typed_fact_i_terminates_part1 : Valid +[wp] [Alt-Ergo] Goal typed_fact_i_terminates_part2 : Valid +[wp] [Alt-Ergo] Goal typed_fact_i_variant : Unsuccess +[wp] [Qed] Goal typed_fails_fact_i_terminates_part1 : Valid +[wp] [Alt-Ergo] Goal typed_fails_fact_i_terminates_part2 : Unsuccess +[wp] [Alt-Ergo] Goal typed_fails_fact_i_variant : Unsuccess +[wp] [Alt-Ergo] Goal typed_m2_variant_part1 : Valid +[wp] [Alt-Ergo] Goal typed_m2_variant_part2 : Valid +[wp] [Alt-Ergo] Goal typed_m1_variant : Valid +[wp] [Alt-Ergo] Goal typed_missing_variant_part1 : Unsuccess (Degenerated) +[wp] [Alt-Ergo] Goal typed_missing_variant_part2 : Valid +[wp] [Qed] Goal typed_mt2_terminates_part1 : Valid +[wp] [Qed] Goal typed_mt2_terminates_part2 : Valid +[wp] [Alt-Ergo] Goal typed_mt2_variant_part1 : Valid +[wp] [Alt-Ergo] Goal typed_mt2_variant_part2 : Valid +[wp] [Qed] Goal typed_mt1_terminates_part1 : Valid +[wp] [Alt-Ergo] Goal typed_mt1_terminates_part2 : Unsuccess +[wp] [Alt-Ergo] Goal typed_mt1_variant : Valid +[wp] [Alt-Ergo] Goal typed_mw2_variant_part1 : Unsuccess (Degenerated) +[wp] [Alt-Ergo] Goal typed_mw2_variant_part2 : Valid +[wp] [Alt-Ergo] Goal typed_mw1_variant : Unsuccess (Degenerated) +[wp] Proved goals: 17 / 26 + Qed: 6 + Alt-Ergo: 11 (unsuccess: 9) +------------------------------------------------------------ + Functions WP Alt-Ergo Total Success + fact 1 1 2 100% + fails_fact - - 1 0.0% + facto_gen - 1 1 100% + fails_facto_gen - - 1 0.0% + fact_i 1 1 3 66.7% + fails_fact_i 1 - 3 33.3% + m2 - 2 2 100% + m1 - 1 1 100% + missing - 1 2 50.0% + mt2 2 2 4 100% + mt1 1 1 3 66.7% + mw2 - 1 2 50.0% + mw1 - - 1 0.0% +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.1.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..63e3fba1f7426ce524df7c0e5c5f319d6f557091 --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.1.res.oracle @@ -0,0 +1,57 @@ +# frama-c -wp [...] +[kernel] Parsing decreases.i (no preprocessing) +[wp] Running WP plugin... +[wp] Warning: Missing RTE guards +[wp:hypothesis] decreases.i:108: Warning: 'Rel' relation must be well-founded +[wp] decreases.i:71: Warning: No decreases clause for missing_2 +[wp:hypothesis] decreases.i:108: Warning: 'Wrong' relation must be well-founded +[wp] decreases.i:109: Warning: + On call to mw1, relation (Wrong) does not match caller (Rel) +[wp] decreases.i:105: Warning: + On call to mw2, relation (Rel) does not match caller (Wrong) +[wp] 26 goals scheduled +[wp] [Qed] Goal typed_fact_terminates : Valid +[wp] [Alt-Ergo] Goal typed_fact_variant : Valid +[wp] [Alt-Ergo] Goal typed_fails_fact_variant : Unsuccess +[wp] [Alt-Ergo] Goal typed_facto_gen_variant : Valid +[wp] [Alt-Ergo] Goal typed_fails_facto_gen_variant : Unsuccess +[wp] [Qed] Goal typed_fact_i_terminates_part1 : Valid +[wp] [Alt-Ergo] Goal typed_fact_i_terminates_part2 : Valid +[wp] [Alt-Ergo] Goal typed_fact_i_variant : Valid +[wp] [Qed] Goal typed_fails_fact_i_terminates_part1 : Valid +[wp] [Alt-Ergo] Goal typed_fails_fact_i_terminates_part2 : Unsuccess +[wp] [Alt-Ergo] Goal typed_fails_fact_i_variant : Unsuccess +[wp] [Alt-Ergo] Goal typed_m2_variant_part1 : Valid +[wp] [Alt-Ergo] Goal typed_m2_variant_part2 : Valid +[wp] [Alt-Ergo] Goal typed_m1_variant : Valid +[wp] [Alt-Ergo] Goal typed_missing_variant_part1 : Unsuccess (Degenerated) +[wp] [Alt-Ergo] Goal typed_missing_variant_part2 : Valid +[wp] [Qed] Goal typed_mt2_terminates_part1 : Valid +[wp] [Qed] Goal typed_mt2_terminates_part2 : Valid +[wp] [Alt-Ergo] Goal typed_mt2_variant_part1 : Valid +[wp] [Qed] Goal typed_mt2_variant_part2 : Valid +[wp] [Qed] Goal typed_mt1_terminates_part1 : Valid +[wp] [Alt-Ergo] Goal typed_mt1_terminates_part2 : Unsuccess +[wp] [Alt-Ergo] Goal typed_mt1_variant : Valid +[wp] [Alt-Ergo] Goal typed_mw2_variant_part1 : Unsuccess (Degenerated) +[wp] [Alt-Ergo] Goal typed_mw2_variant_part2 : Valid +[wp] [Alt-Ergo] Goal typed_mw1_variant : Unsuccess (Degenerated) +[wp] Proved goals: 18 / 26 + Qed: 7 + Alt-Ergo: 11 (unsuccess: 8) +------------------------------------------------------------ + Functions WP Alt-Ergo Total Success + fact 1 1 2 100% + fails_fact - - 1 0.0% + facto_gen - 1 1 100% + fails_facto_gen - - 1 0.0% + fact_i 1 2 3 100% + fails_fact_i 1 - 3 33.3% + m2 - 2 2 100% + m1 - 1 1 100% + missing - 1 2 50.0% + mt2 3 1 4 100% + mt1 1 1 3 66.7% + mw2 - 1 2 50.0% + mw1 - - 1 0.0% +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.2.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/global_const_dependencies.res.oracle similarity index 51% rename from src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.2.res.oracle rename to src/plugins/wp/tests/wp_acsl/oracle_qualif/global_const_dependencies.res.oracle index 34c366ca1cffba4cf705fc0c994faccac7529d81..3f93a0b972d943c83255f82232a366eece6c4205 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.2.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/global_const_dependencies.res.oracle @@ -1,14 +1,12 @@ # frama-c -wp [...] -[kernel] Parsing abs.i (no preprocessing) +[kernel] Parsing global_const_dependencies.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards -[wp] Warning: native support for alt-ergo is deprecated, use why3 instead [wp] 1 goal scheduled -[wp] [Alt-Ergo (native)] Goal typed_abs_abs_ensures : Valid +[wp] [Qed] Goal typed_main_assert : Valid [wp] Proved goals: 1 / 1 - Qed: 0 - Alt-Ergo (native): 1 + Qed: 1 ------------------------------------------------------------ Functions WP Alt-Ergo Total Success - abs - - 1 100% + main 1 - 1 100% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/gnu_zero_array.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/gnu_zero_array.res.oracle index 26cfc3ad34548c8ce6555176bdabbf970c5b71e0..2ac1dd590cfe6848231ee11330f3a8a46de291ef 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/gnu_zero_array.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/gnu_zero_array.res.oracle @@ -1,6 +1,6 @@ # frama-c -wp [...] [kernel] Parsing gnu_zero_array.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [wp] Running WP plugin... [wp] gnu_zero_array.i:14: Warning: Cast with incompatible pointers types (source: sint8*) (target: S*) diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/opaque_struct.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/opaque_struct.res.oracle index 2e8a5bd7c03ad64457355e2bf3317d3a86a3c29d..7ce463d9349eea815c4d793dc147ec1b41d0b8bc 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/opaque_struct.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/opaque_struct.res.oracle @@ -1,12 +1,12 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing opaque_struct.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function assigned_via_pointer -[rte] annotating function assigns -[rte] annotating function assigns_effect -[rte] annotating function chunk_typing -[rte] annotating function initialized_assigns -[rte] annotating function uninitialized_assigns +[rte:annot] annotating function assigned_via_pointer +[rte:annot] annotating function assigns +[rte:annot] annotating function assigns_effect +[rte:annot] annotating function chunk_typing +[rte:annot] annotating function initialized_assigns +[rte:annot] annotating function uninitialized_assigns [kernel:annot:missing-spec] opaque_struct.i:79: Warning: Neither code nor specification for function use, generating default assigns from the prototype [wp] 15 goals scheduled diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_formulae.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_formulae.res.oracle index c0f94521150167b78b2c9e773053d9818dcde142..cf90d39ba3fc26032ba408a35e80cd1c1badb88a 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_formulae.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_formulae.res.oracle @@ -2,8 +2,13 @@ [kernel] Parsing terminates_formulae.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards +[wp:hypothesis] terminates_formulae.i:90: Warning: + 'Rel' relation must be well-founded +[wp] [CFG] Goal general_variant_terminates : Valid (Trivial) [wp] [CFG] Goal variant_terminates : Valid (Trivial) -[wp] 10 goals scheduled +[wp] terminates_formulae.i:90: Warning: + No 'decreases' clause on recursive function 'no_decreases', cannot prove termination +[wp] 18 goals scheduled [wp] [Alt-Ergo] Goal typed_base_call_terminates : Unsuccess [wp] [Qed] Goal typed_call_same_terminates : Valid [wp] [Alt-Ergo] Goal typed_call_change_terminates : Unsuccess @@ -12,11 +17,19 @@ [wp] [Qed] Goal typed_variant_loop_assigns : Valid [wp] [Alt-Ergo] Goal typed_variant_loop_variant_decrease : Valid [wp] [Qed] Goal typed_variant_loop_variant_positive : Valid +[wp] [Qed] Goal typed_general_variant_loop_assigns : Valid +[wp] [Alt-Ergo] Goal typed_general_variant_loop_variant_relation : Valid [wp] [Alt-Ergo] Goal typed_no_variant_terminates : Unsuccess [wp] [Qed] Goal typed_no_variant_loop_assigns : Valid -[wp] Proved goals: 7 / 11 - Qed: 5 - Alt-Ergo: 1 (unsuccess: 4) +[wp] [Qed] Goal typed_decreases_terminates : Valid +[wp] [Alt-Ergo] Goal typed_decreases_variant : Valid +[wp] [Qed] Goal typed_general_decreases_terminates : Valid +[wp] [Alt-Ergo] Goal typed_general_decreases_variant : Valid +[wp] [Qed] Goal typed_no_decreases_terminates_part1 : Valid +[wp] [Alt-Ergo] Goal typed_no_decreases_terminates_part2 : Unsuccess +[wp] Proved goals: 15 / 20 + Qed: 9 + Alt-Ergo: 4 (unsuccess: 5) ------------------------------------------------------------ Functions WP Alt-Ergo Total Success base_call - - 1 0.0% @@ -25,5 +38,9 @@ call_param_same 1 - 1 100% call_param_change - - 1 0.0% variant 2 1 3 100% + general_variant 1 1 2 100% no_variant 1 - 2 50.0% + decreases 1 1 2 100% + general_decreases 1 1 2 100% + no_decreases 1 - 2 50.0% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/tset.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/tset.res.oracle index 678ead75a09a52d12646a33a60c522dc7c4244ba..09696132705eae973a73ded6c9ea2d4e14da184d 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/tset.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/tset.res.oracle @@ -1,7 +1,6 @@ # frama-c -wp [...] [kernel] Parsing tset.i (no preprocessing) [wp] Running WP plugin... -[wp] Warning: native support for coq is deprecated, use tip instead [wp] 4 goals scheduled [wp] [Qed] Goal typed_lemma_UNION_DESCR : Valid [wp] [Alt-Ergo] Goal typed_lemma_UNION_EQ : Valid diff --git a/src/plugins/wp/tests/wp_acsl/terminates_formulae.i b/src/plugins/wp/tests/wp_acsl/terminates_formulae.i index cbad957517a53a40dbc52b5c7f1d4c5a8933c627..5a3e16c8827f5acab07ea3435f02d328c7c12c3d 100644 --- a/src/plugins/wp/tests/wp_acsl/terminates_formulae.i +++ b/src/plugins/wp/tests/wp_acsl/terminates_formulae.i @@ -59,8 +59,34 @@ void variant(void){ for(unsigned i = 3; i > 0; --i); } +/*@ predicate Rel (integer old, integer new) = old > new && 0 <= old; */ + +//@ terminates Q ; +void general_variant(unsigned x) { + /*@ loop assigns x ; + loop variant x for Rel; */ + while (x > 0) x --; +} + //@ terminates Q ; void no_variant(void){ //@ loop assigns i ; for(unsigned i = 3; i > 0; --i); } + +/*@ terminates Q ; + decreases n ; */ +void decreases(unsigned n){ + if(n != 0) decreases(n-1) ; +} + +/*@ terminates Q ; + decreases n for Rel; */ +void general_decreases(unsigned n){ + if(n != 0) general_decreases(n-1) ; +} + +/*@ terminates Q ; */ +void no_decreases(unsigned n){ + if(n != 0) no_decreases(n-1) ; +} diff --git a/src/plugins/wp/tests/wp_acsl/tset.i b/src/plugins/wp/tests/wp_acsl/tset.i index 1f7b11df21bbacb99fcbf4de995db036cac04e8d..25b3086279f47a8140a381d0e01d80ba94451228 100644 --- a/src/plugins/wp/tests/wp_acsl/tset.i +++ b/src/plugins/wp/tests/wp_acsl/tset.i @@ -1,11 +1,11 @@ /* run.config_qualif - OPT: -wp -wp-prover alt-ergo,native:coq -wp-coq-script %{dep:@PTEST_DIR@/tset.s} + OPT: -wp -wp-prover alt-ergo */ /*@ lemma UNION_EQ: - \forall integer x,y ; + \forall integer x,y ; (\union(0,x) == \union(0,y)) <==> (x==y) ; lemma UNION_LIFT: diff --git a/src/plugins/wp/tests/wp_acsl/tset.s b/src/plugins/wp/tests/wp_acsl/tset.s deleted file mode 100644 index f8e5168a8acca70cb731d128acafedef528c92b8..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_acsl/tset.s +++ /dev/null @@ -1,9 +0,0 @@ -(* Generated by Frama-C WP *) - -Goal typed_lemma_UNION_DESCR. -Hint UNION_DESCR,property. -Proof. - intros. exists (i_1-i). intuition (auto with zarith). -Qed. - - diff --git a/src/plugins/wp/tests/wp_bts/bts_1174.i b/src/plugins/wp/tests/wp_bts/bts_1174.i index ce50d9189258794e8e0292d0262e3e922e763a83..48e3199393a79307d4cfb2bd8883c896c4580e3b 100644 --- a/src/plugins/wp/tests/wp_bts/bts_1174.i +++ b/src/plugins/wp/tests/wp_bts/bts_1174.i @@ -1,5 +1,5 @@ /* run.config_qualif - OPT: -wp -wp-prover native:coq -wp-coq-script %{dep:@PTEST_DIR@/bts_1174.s} -wp-model +real + OPT: -wp -wp-model +real */ /*@ requires -10. <= x && x <= 10.; */ diff --git a/src/plugins/wp/tests/wp_bts/bts_1174.s b/src/plugins/wp/tests/wp_bts/bts_1174.s deleted file mode 100644 index c1d443b3b02a23d7bd40478f0e9968e91bae2842..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_bts/bts_1174.s +++ /dev/null @@ -1,47 +0,0 @@ -(* Generated by Frama-C WP *) - -Goal store_job_assert_qed_ok. -Hint job,property,qed_ok. -Proof. - intros. - Require Import Fourier. - unfold r_1. - fourier. -Qed. - -Goal store_main_assert_qed_ok. -Hint main,property,qed_ok. -Proof. - intros. - Require Import Fourier. - unfold r_1. - fourier. -Qed. - -Goal store_main_pre. -Hint default,main,property. -Proof. - intros. - Require Import Fourier. - unfold r_1. - fourier. -Qed. - -Goal typed_job_assert_qed_ok. -Hint job,property,qed_ok. -Proof. - intros. - Require Import Fourier. - unfold r_1. - fourier. -Qed. - -Goal typed_real_job_assert_qed_ok. -Hint job,property,qed_ok. -Proof. - intros. - Require Import Fourier. - fourier. -Qed. - - diff --git a/src/plugins/wp/tests/wp_bts/bts_2471.i b/src/plugins/wp/tests/wp_bts/bts_2471.i index a25c144dafc34fea9b4067ea4e9e953d1ff1505e..813a965c35d1ea71a74e62632119a040c7b40b91 100644 --- a/src/plugins/wp/tests/wp_bts/bts_2471.i +++ b/src/plugins/wp/tests/wp_bts/bts_2471.i @@ -4,7 +4,6 @@ /* run.config_qualif OPT: -wp-timeout 1 - OPT: -wp-prover native:coq */ /*@ axiomatic maps { diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_1360.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_1360.res.oracle index 264756b50180129645e0f50476ac5ceea21f5bcb..81ab1a3e10f8e8817eb8199e94cd9c52c2718e86 100644 --- a/src/plugins/wp/tests/wp_bts/oracle/bts_1360.res.oracle +++ b/src/plugins/wp/tests/wp_bts/oracle/bts_1360.res.oracle @@ -1,8 +1,8 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing bts_1360.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function foo_correct -[rte] annotating function foo_wrong +[rte:annot] annotating function foo_correct +[rte:annot] annotating function foo_wrong ------------------------------------------------------------ Function foo_correct ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_bts/oracle/ex5.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/ex5.res.oracle index 5e8dbbdb083eaebabe3ecc551b3c132ed4cba53b..97a39bb3a6724b65d10cf1d9e29ab07a9af9491c 100644 --- a/src/plugins/wp/tests/wp_bts/oracle/ex5.res.oracle +++ b/src/plugins/wp/tests/wp_bts/oracle/ex5.res.oracle @@ -174,7 +174,7 @@ Prove: (i + L_f(i)) != b. ------------------------------------------------------------ Goal Post-condition 'ko4' in 'forall': -Prove: (L_f(i) != i_1) \/ P_P(i_1). +Prove: P_P(L_f(i)). ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_bts/oracle/issue_751.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/issue_751.res.oracle index 6c74a498337a8547eb0dacd1cf85f2c6177e638a..18231f2787cfacbce7f1fd426b27d0a7d6beaf6e 100644 --- a/src/plugins/wp/tests/wp_bts/oracle/issue_751.res.oracle +++ b/src/plugins/wp/tests/wp_bts/oracle/issue_751.res.oracle @@ -10,8 +10,7 @@ Goal Preservation of Invariant 'RANGE' (file issue_751.i, line 7): Let x = land(3840, R). Let x_1 = x / 256. Assume { - Type: is_sint32(R) /\ is_sint32(j) /\ is_sint32(1 + j) /\ - is_sint32(lsr(x, 8)). + Type: is_sint32(R) /\ is_sint32(j) /\ is_sint32(1 + j). (* Pre-condition *) Have: (0 < x) /\ (x <= 2303). (* Invariant 'RANGE' *) @@ -36,18 +35,17 @@ Prove: true. Goal Loop assigns (file issue_751.i, line 8) (2/2): Effect at line 11 Let x = land(3840, R). -Let x_1 = lsr(x, 8). -Let x_2 = j - 1. +Let x_1 = j - 1. Assume { - Type: is_sint32(R) /\ is_sint32(j) /\ is_sint32(x_2) /\ is_sint32(x_1). + Type: is_sint32(R) /\ is_sint32(j) /\ is_sint32(x_1). (* Heap *) Type: (region(Data_0.base) <= 0) /\ linked(Malloc_0). (* Goal *) - When: !invalid(Malloc_0, shift_sint32(Data_0, x_2), 1). + When: !invalid(Malloc_0, shift_sint32(Data_0, x_1), 1). (* Pre-condition *) Have: (0 < x) /\ (x <= 2303). (* Invariant 'RANGE' *) - Have: (0 < j) /\ (j <= (1 + x_1)). + Have: (0 < j) /\ (j <= (1 + lsr(x, 8))). (* Then *) Have: j <= (x / 256). } diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts779.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts779.res.oracle index dbb98c6df14292b6b3f805888a739fec56d47ac8..ca40bafd86e9470752fe7e8a3d7857e471e39c67 100644 --- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts779.res.oracle +++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts779.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing bts779.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function f +[rte:annot] annotating function f [wp] 2 goals scheduled [wp] [Alt-Ergo] Goal typed_f_assert : Valid [wp] [Alt-Ergo] Goal typed_f_assert_rte_mem_access : Unsuccess diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1174.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1174.res.oracle index d9a23912c0146b7c40b02c375c68271fcab0e186..288a484c71d1d73941afd4bdbced3c1992716336 100644 --- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1174.res.oracle +++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1174.res.oracle @@ -2,14 +2,12 @@ [kernel] Parsing bts_1174.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards -[wp] Warning: native support for coq is deprecated, use tip instead [wp] 1 goal scheduled -[wp] [Coq] Goal typed_real_job_assert_qed_ok : Saved script -[wp] [Coq (native)] Goal typed_real_job_assert_qed_ok : Valid +[wp] [Alt-Ergo] Goal typed_real_job_assert_qed_ok : Valid [wp] Proved goals: 1 / 1 Qed: 0 - Coq (native): 1 + Alt-Ergo: 1 ------------------------------------------------------------ Functions WP Alt-Ergo Total Success - job - - 1 100% + job - 1 1 100% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1360.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1360.res.oracle index 5072e7c6182b7fce459e1727cd69ba7b7bb4f8b5..92f813ec7b9afb87519940378b18806dc1ea12ed 100644 --- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1360.res.oracle +++ b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_1360.res.oracle @@ -1,8 +1,8 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing bts_1360.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function foo_correct -[rte] annotating function foo_wrong +[rte:annot] annotating function foo_correct +[rte:annot] annotating function foo_wrong [wp] 10 goals scheduled [wp] [Qed] Goal typed_foo_wrong_ensures : Valid [wp] [Qed] Goal typed_foo_wrong_assert_rte_mem_access : Valid diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.1.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.1.res.oracle deleted file mode 100644 index 8d031ef0aec0346a1b754a010c2e9c610ff308a1..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.1.res.oracle +++ /dev/null @@ -1,14 +0,0 @@ -# frama-c -wp [...] -[kernel] Parsing bts_2471.i (no preprocessing) -[wp] Running WP plugin... -[wp] Warning: Missing RTE guards -[wp] Warning: native support for coq is deprecated, use tip instead -[wp] 1 goal scheduled -[wp] [Coq] Goal typed_foo_assert_ko : Default tactic -[wp] [Coq (native)] Goal typed_foo_assert_ko : Unsuccess -[wp] Proved goals: 0 / 1 - Coq (native): 0 (unsuccess: 1) ------------------------------------------------------------- - Functions WP Alt-Ergo Total Success - foo - - 1 0.0% ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.0.res.oracle b/src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.res.oracle similarity index 100% rename from src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.0.res.oracle rename to src/plugins/wp/tests/wp_bts/oracle_qualif/bts_2471.res.oracle diff --git a/src/plugins/wp/tests/wp_eva/test_config_qualif b/src/plugins/wp/tests/wp_eva/test_config_qualif index 8f8c6e5c791fd649d5d9a45b234bbf850e2b3ce6..5cc6f72566ce5f45d29d47a3ee4d208b904d271b 100644 --- a/src/plugins/wp/tests/wp_eva/test_config_qualif +++ b/src/plugins/wp/tests/wp_eva/test_config_qualif @@ -1,2 +1,2 @@ -CMD: @frama-c@ -no-autoload-plugins -load-module eva,scope,reduc,wp -eva -eva-no-print -eva-verbose 0 @PTEST_FILE@ -then -reduc -reduc-gen-annot all -then -no-reduc -then -wp -wp-par 1 -wp-share @PTEST_SHARE_DIR@ -wp-msg-key shell -wp-report tests/qualif.report -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session -wp-cache-env -wp-cache replay @PTEST_FILE@ -wp-coq-timeout 120 +CMD: @frama-c@ -no-autoload-plugins -load-module eva,scope,reduc,wp -eva -eva-no-print -eva-verbose 0 @PTEST_FILE@ -then -reduc -reduc-gen-annot all -then -no-reduc -then -wp -wp-par 1 -wp-share @PTEST_SHARE_DIR@ -wp-msg-key shell -wp-report tests/qualif.report -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session -wp-cache-env -wp-cache replay @PTEST_FILE@ OPT: diff --git a/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication-without-overflow.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication-without-overflow.res.oracle index 28237b20e82952365c6dce412e7dd899aab45260..bf6099d4282e22068301bb5f3f590903ece5442c 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication-without-overflow.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication-without-overflow.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte -warn-unsigned-overflow [...] [kernel] Parsing binary-multiplication-without-overflow.c (with preprocessing) [wp] Running WP plugin... -[rte] annotating function BinaryMultiplication +[rte:annot] annotating function BinaryMultiplication [wp] Goal typed_lemma_half : not tried [wp] Goal typed_lemma_size : trivial [wp] Goal typed_BinaryMultiplication_ensures_product : not tried diff --git a/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication.res.oracle index 048a6c47d58e6ddf6a25d77e35f3c7b63d3df16e..f1fdbe0b4cc752ffa0732f9e9ad4881d6e4b515c 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle/binary-multiplication.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing binary-multiplication.c (with preprocessing) [wp] Running WP plugin... -[rte] annotating function BinaryMultiplication +[rte:annot] annotating function BinaryMultiplication [wp] Goal typed_lemma_ax1_lack : not tried [wp] Goal typed_lemma_ax2_lack : not tried [wp] Goal typed_lemma_ax3_lack : not tried diff --git a/src/plugins/wp/tests/wp_gallery/oracle/find.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/find.res.oracle index 3404140fd4c049bd09fa26d16d0631dc65133622..1c422c3ae8060811d27de8a6d0e4e119f5b17104 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle/find.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle/find.res.oracle @@ -1,9 +1,9 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing find.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function find -[rte] annotating function find_ptr -[rte] annotating function iter_ptr +[rte:annot] annotating function find +[rte:annot] annotating function find_ptr +[rte:annot] annotating function iter_ptr [wp] Goal typed_find_complete_found_not_found : trivial [wp] Goal typed_find_disjoint_found_not_found : trivial [wp] Goal typed_find_ensures_Range : not tried diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo1_solved.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo1_solved.res.oracle index a64994d35ec0157bee80e6e73d6630ffe17ffd13..a5d9db2ea1f9b22a46441e932d40a342bd3d9e7f 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo1_solved.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo1_solved.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing frama_c_exo1_solved.c (with preprocessing) [wp] Running WP plugin... -[rte] annotating function exo1 +[rte:annot] annotating function exo1 [wp] Goal typed_exo1_ensures : not tried [wp] Goal typed_exo1_ensures_2 : not tried [wp] Goal typed_exo1_assert_rte_signed_overflow : not tried diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo2_solved.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo2_solved.res.oracle index 0428d0c647cd3f9919b4ddc584cbdb65cdf8d74a..9bb5d4d873d8a99cb647128fadddaaed3dc7b3be 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo2_solved.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo2_solved.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte -no-warn-signed-overflow [...] [kernel] Parsing frama_c_exo2_solved.c (with preprocessing) [wp] Running WP plugin... -[rte] annotating function max_subarray +[rte:annot] annotating function max_subarray [wp] Goal typed_max_subarray_ensures : not tried [wp] Goal typed_max_subarray_ensures_2 : not tried [wp] Goal typed_max_subarray_loop_invariant_preserved : not tried diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.res.oracle index 27f763c44a4745e89409af9461cc176f6d1a201f..139983c87a75d6651083a4a172c6d43bc3697a9e 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte -wp-model 'Typed (Ref)' [...] [kernel] Parsing frama_c_exo3_solved.old.c (with preprocessing) [wp] Running WP plugin... -[rte] annotating function equal_elements +[rte:annot] annotating function equal_elements [wp] Goal typed_ref_equal_elements_ensures : not tried [wp] Goal typed_ref_equal_elements_ensures_2 : not tried [wp] Goal typed_ref_equal_elements_ensures_3 : not tried diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.v2.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.v2.res.oracle index 9d37bb24d584c7bf2d9b68352d093773f9e09c21..34e76d7b36b530040ca8b365d79bdc4c9570f568 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.v2.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.old.v2.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte -wp-model 'Typed (Ref)' [...] [kernel] Parsing frama_c_exo3_solved.old.v2.c (with preprocessing) [wp] Running WP plugin... -[rte] annotating function equal_elements +[rte:annot] annotating function equal_elements [wp] Goal typed_ref_equal_elements_ensures_v1_good : not tried [wp] Goal typed_ref_equal_elements_ensures_v2_good : not tried [wp] Goal typed_ref_equal_elements_ensures_v1_v2_diff : not tried diff --git a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.simplified.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.simplified.res.oracle index 87662055df23ba6c321a2bc60e5b5168f5b87d15..d25f2ecbefac280ca4963cd4f74790fc611fb3e6 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.simplified.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle/frama_c_exo3_solved.simplified.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing frama_c_exo3_solved.simplified.c (with preprocessing) [wp] Running WP plugin... -[rte] annotating function pair +[rte:annot] annotating function pair [wp] Goal typed_pair_complete_has_pair_no_pair : trivial [wp] Goal typed_pair_disjoint_has_pair_no_pair : trivial [wp] Goal typed_pair_loop_invariant_preserved : not tried diff --git a/src/plugins/wp/tests/wp_gallery/oracle/string-compare.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/string-compare.res.oracle index 871e62444cac972f6e8273ddc1c138d4ddbf3828..50c359b8fc4f871225b38f014feb9f622fd7038b 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle/string-compare.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle/string-compare.res.oracle @@ -1,9 +1,9 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing string-compare.c (with preprocessing) [wp] Running WP plugin... -[rte] annotating function main -[rte] annotating function stringCompare -[rte] annotating function stringLength +[rte:annot] annotating function main +[rte:annot] annotating function stringCompare +[rte:annot] annotating function stringLength [wp] [CFG] Goal stringCompare_exits_never : Valid (Unreachable) [wp] [CFG] Goal stringLength_exits_never : Valid (Unreachable) [wp] Goal typed_stringCompare_complete_SomeDifferent_allEqual : trivial diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication-without-overflow.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication-without-overflow.res.oracle index 8b3b8ce8f5b18a8b19ab37dd367fb7231c48f8bf..fda9d1592fcde0fd6bf80aa7a818d7c719d0c3e7 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication-without-overflow.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication-without-overflow.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte -wp-timeout 20 -warn-unsigned-overflow [...] [kernel] Parsing binary-multiplication-without-overflow.c (with preprocessing) [wp] Running WP plugin... -[rte] annotating function BinaryMultiplication +[rte:annot] annotating function BinaryMultiplication [wp] 16 goals scheduled [wp] [Alt-Ergo] Goal typed_lemma_half : Valid [wp] [Qed] Goal typed_lemma_size : Valid diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication.res.oracle index 374c185811eccbf13ab99836f863fcb6f43c8ccb..c1ba41635544f4f8d2771e4caff691fbc95638e7 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/binary-multiplication.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing binary-multiplication.c (with preprocessing) [wp] Running WP plugin... -[rte] annotating function BinaryMultiplication +[rte:annot] annotating function BinaryMultiplication [wp] 17 goals scheduled [wp] [Alt-Ergo] Goal typed_lemma_ax4_ok : Valid [wp] [Alt-Ergo] Goal typed_lemma_ax5_ok : Valid diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/bsearch.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/bsearch.res.oracle index f3c3ceeb9d3ee22c07392c0ef679727b0dc47798..b6e73bdde324ab5d2f6961c6773b1b4b80656deb 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/bsearch.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/bsearch.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing bsearch.c (with preprocessing) [wp] Running WP plugin... -[rte] annotating function binary_search +[rte:annot] annotating function binary_search [wp] 28 goals scheduled [wp] [Passed] Smoke-test typed_binary_search_wp_smoke_default_requires [wp] [Passed] Smoke-test typed_binary_search_wp_smoke_dead_loop_s3 diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/euclid.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/euclid.res.oracle index da9813c2fb9daf073f0babb7e050055580c2d224..d3aaf8ea83ff392207675938102fb74ad56eccaa 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/euclid.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/euclid.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing euclid.c (with preprocessing) [wp] Running WP plugin... -[rte] annotating function euclid_gcd +[rte:annot] annotating function euclid_gcd [wp] 16 goals scheduled [wp] [Passed] Smoke-test typed_euclid_euclid_gcd_wp_smoke_default_requires [wp] [Passed] Smoke-test typed_euclid_euclid_gcd_wp_smoke_dead_loop_s1 diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/find.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/find.res.oracle index 0760f8c1ed9a053d7dae27231140e001e240e7e1..6fc4641c2a918d26bae446e524b503705425f3df 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/find.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/find.res.oracle @@ -54,9 +54,9 @@ iter_ptr 2 6 8 100% ------------------------------------------------------------ [wp] Running WP plugin... -[rte] annotating function find -[rte] annotating function find_ptr -[rte] annotating function iter_ptr +[rte:annot] annotating function find +[rte:annot] annotating function find_ptr +[rte:annot] annotating function iter_ptr [wp] 3 goals scheduled [wp] [Alt-Ergo] Goal typed_find_assert_rte_mem_access : Valid [wp] [Alt-Ergo] Goal typed_find_assert_rte_signed_overflow : Valid diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo1_solved.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo1_solved.res.oracle index 4b982f51859e9264450636ff771075ff5d74795a..472bae3aac8525769125b58c733be5e59855b4e9 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo1_solved.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo1_solved.res.oracle @@ -21,7 +21,7 @@ exo1 6 4 10 100% ------------------------------------------------------------ [wp] Running WP plugin... -[rte] annotating function exo1 +[rte:annot] annotating function exo1 [wp] 5 goals scheduled [wp] [Alt-Ergo] Goal typed_exo1_assert_rte_signed_overflow : Valid [wp] [Alt-Ergo] Goal typed_exo1_assert_rte_mem_access : Valid diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo2_solved.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo2_solved.res.oracle index 83f9d8a5be5060dfa8c264411f2da764ffe9f6ac..9fb7098252504e09573928fbe1ffe9c1284fd622 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo2_solved.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo2_solved.res.oracle @@ -33,7 +33,7 @@ max_subarray 12 10 22 100% ------------------------------------------------------------ [wp] Running WP plugin... -[rte] annotating function max_subarray +[rte:annot] annotating function max_subarray [wp] 1 goal scheduled [wp] [Alt-Ergo] Goal typed_max_subarray_assert_rte_mem_access : Valid [wp] Proved goals: 1 / 1 diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.res.oracle index 46675ba6fcb4418714a63d1d5c559f395d7e3c7a..dfc94d8a3943ced736b0721f08a7b01c3b7c69c7 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.res.oracle @@ -54,7 +54,7 @@ */ void equal_elements(int *a, int *v1, int *v2); [wp] Running WP plugin... -[rte] annotating function equal_elements +[rte:annot] annotating function equal_elements [wp] 16 goals scheduled [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_mem_access : Valid [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_mem_access_2 : Valid diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.v2.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.v2.res.oracle index 8dfaabe1c3834bffe2458219be7a460bedbd26ad..4bf9ab318fb2b123882eaa5b3254c0e63fcf9f24 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.v2.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.old.v2.res.oracle @@ -55,7 +55,7 @@ */ void equal_elements(int *a, int *v1, int *v2); [wp] Running WP plugin... -[rte] annotating function equal_elements +[rte:annot] annotating function equal_elements [wp] 16 goals scheduled [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_mem_access : Valid [wp] [Qed] Goal typed_ref_equal_elements_assert_rte_mem_access_2 : Valid diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.simplified.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.simplified.res.oracle index e2cf934a567dc28914fecb97236a1751f6fcb264..9ca1fbbad3e4eaf7c77acb2bd4fd7bed774c63e1 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.simplified.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/frama_c_exo3_solved.simplified.res.oracle @@ -37,7 +37,7 @@ pair 16 10 26 100% ------------------------------------------------------------ [wp] Running WP plugin... -[rte] annotating function pair +[rte:annot] annotating function pair [wp] 9 goals scheduled [wp] [Qed] Goal typed_pair_assert_rte_index_bound : Valid [wp] [Qed] Goal typed_pair_assert_rte_index_bound_2 : Valid diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/string-compare.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/string-compare.res.oracle index 8ec3a7f69f5cf0634c4cb9febbde67189426537a..d6ad1f485b30f88a8479ac41b4c90ac59985ab2a 100644 --- a/src/plugins/wp/tests/wp_gallery/oracle_qualif/string-compare.res.oracle +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/string-compare.res.oracle @@ -67,9 +67,9 @@ main 5 2 7 100% ------------------------------------------------------------ [wp] Running WP plugin... -[rte] annotating function main -[rte] annotating function stringCompare -[rte] annotating function stringLength +[rte:annot] annotating function main +[rte:annot] annotating function stringCompare +[rte:annot] annotating function stringLength [wp] 8 goals scheduled [wp] [Alt-Ergo] Goal typed_stringCompare_assert_rte_mem_access : Valid [wp] [Alt-Ergo] Goal typed_stringCompare_assert_rte_mem_access_2 : Valid diff --git a/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle index cb28e562b0c7e4b49a8ddd827e64c70298a7bd8a..d9212b184ab900e3b55fc458846461c422af1408 100644 --- a/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle +++ b/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle @@ -260,7 +260,7 @@ Prove: true. Memory model hypotheses for function 'call_reset_5_tps': /*@ behavior wp_typed_ref: - requires \separated((struct T **)tps + (..), tps[9] + (0 .. 4)); + requires \separated(tps[9] + (0 .. 4), (struct T **)tps + (..)); */ void call_reset_5_tps(void); [wp] reference_and_struct.i:88: Warning: diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle index 078661743a9248acf5efce809e9077d94b9173bb..44907b868b9cc5538c94ed260c5ae73e7ea6d776 100644 --- a/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle +++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/reference_and_struct.res.oracle @@ -58,7 +58,7 @@ Memory model hypotheses for function 'call_reset_5_tps': /*@ behavior wp_typed_ref: - requires \separated((struct T **)tps + (..), tps[9] + (0 .. 4)); + requires \separated(tps[9] + (0 .. 4), (struct T **)tps + (..)); */ void call_reset_5_tps(void); [wp] reference_and_struct.i:88: Warning: diff --git a/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.1.res.oracle b/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.1.res.oracle index fb13236dbf626facd576c4934ec557d2b0285c38..b34ba7805c8a383c50e53f0ce20467d47b9a4f90 100644 --- a/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.1.res.oracle +++ b/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.1.res.oracle @@ -3,7 +3,7 @@ [kernel] Parsing working_dir/swap.c (with preprocessing) [kernel] Parsing working_dir/swap2.h (with preprocessing) [wp] Running WP plugin... -[rte] annotating function swap +[rte:annot] annotating function swap [wp] 8 goals scheduled [wp] [Alt-Ergo] Goal typed_swap_ensures_A : Valid [wp] [Qed] Goal typed_swap_ensures_B : Valid diff --git a/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.2.res.oracle b/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.2.res.oracle index 15ac0f70d86c802229aaf2fdac0953b775713f3f..f22342a088335ac45d7694c7767e8f5304a6906b 100644 --- a/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.2.res.oracle +++ b/src/plugins/wp/tests/wp_manual/oracle_qualif/manual.2.res.oracle @@ -1,5 +1,5 @@ # frama-c -wp -wp-rte [...] -[rte] annotating function swap +[rte:annot] annotating function swap ------------------------------------------------------------ Functions WP Alt-Ergo Total Success swap 5 3 8 100% diff --git a/src/plugins/wp/tests/wp_plugin/Abs.v b/src/plugins/wp/tests/wp_plugin/Abs.v deleted file mode 100644 index 71280cae205e57f15051ed9ee5bb44b9cb006540..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/Abs.v +++ /dev/null @@ -1,4 +0,0 @@ -Require Import ZArith. - -Definition my_abs := Z.abs. - diff --git a/src/plugins/wp/tests/wp_plugin/abs.driver b/src/plugins/wp/tests/wp_plugin/abs.driver index 97bcd60eadc035dc88e07d7176196f32c897b3c0..1dec77f8d80595ace2f88e00a464f871953e4a0e 100644 --- a/src/plugins/wp/tests/wp_plugin/abs.driver +++ b/src/plugins/wp/tests/wp_plugin/abs.driver @@ -1,6 +1,4 @@ library "abs": logic integer ABS (integer) = "my_abs" ; -coq.file := "Abs.v"; -altergo.file := "abs.mlw"; why3.file := "abs.why"; diff --git a/src/plugins/wp/tests/wp_plugin/abs.i b/src/plugins/wp/tests/wp_plugin/abs.i index 321483c54b8ade7cb3782870de9e9a5cc49b0445..a602a11d813578ba99b10380fa702855e49c3e30 100644 --- a/src/plugins/wp/tests/wp_plugin/abs.i +++ b/src/plugins/wp/tests/wp_plugin/abs.i @@ -1,14 +1,12 @@ /* run.config COMMENT: depends from files mentionned into "abs.driver" - DEPS: abs.why abs.mlw abs.script Abs.v + DEPS: abs.why OPT: -wp-driver %{dep:@PTEST_DIR@/abs.driver} */ /* run.config_qualif COMMENT: depends from files mentionned into "abs.driver" - DEPS: abs.why abs.mlw abs.script Abs.v + DEPS: abs.why OPT: -wp -wp-driver %{dep:@PTEST_DIR@/abs.driver} -wp-prover alt-ergo - OPT: -wp -wp-driver %{dep:@PTEST_DIR@/abs.driver} -wp-prover native:coq -wp-coq-script %{dep:@PTEST_DIR@/abs.script} - OPT: -wp -wp-driver %{dep:@PTEST_DIR@/abs.driver} -wp-prover native:alt-ergo */ /*@ axiomatic Absolute { logic integer ABS(integer x) ; } */ diff --git a/src/plugins/wp/tests/wp_plugin/abs.mlw b/src/plugins/wp/tests/wp_plugin/abs.mlw deleted file mode 100644 index ad61e9bf35704fe57208a6b5301d001f007409e4..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/abs.mlw +++ /dev/null @@ -1,3 +0,0 @@ -logic my_abs : int -> int -axiom abs_pos : forall x:int. x>=0 -> my_abs(x) = x -axiom abs_neg : forall x:int. x<=0 -> my_abs(x) = -x diff --git a/src/plugins/wp/tests/wp_plugin/abs.script b/src/plugins/wp/tests/wp_plugin/abs.script deleted file mode 100644 index 9303a5e547253988ed4a35b21650bd7641569c51..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/abs.script +++ /dev/null @@ -1,13 +0,0 @@ -(* Generated by Frama-C WP *) - -Goal typed_abs_abs_ensures. -Hint abs,default,property. -Proof. - intro n. intros. subst. - unfold my_abs. - induction H1; - [ intros ; rewrite Zabs_non_eq | intros ; rewrite Z.abs_eq ] ; - auto with zarith. -Qed. - - diff --git a/src/plugins/wp/tests/wp_plugin/convert.i b/src/plugins/wp/tests/wp_plugin/convert.i index 2dce3a4622568c9e1a54a0b8e00ecf5d4b4301a6..c1cd5e0b31ebd6d52ad1a7a358b05d820fae632c 100644 --- a/src/plugins/wp/tests/wp_plugin/convert.i +++ b/src/plugins/wp/tests/wp_plugin/convert.i @@ -4,7 +4,6 @@ /* run.config_qualif OPT: - OPT: -wp-prover native:alt-ergo -wp-report=%{dep:@PTEST_SUITE_DIR@/../native.report} */ // -------------------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/flash-ergo.driver b/src/plugins/wp/tests/wp_plugin/flash-ergo.driver deleted file mode 100644 index 3a0caaa7b5aa77e404741f3fb27e0d8bd0f47609..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/flash-ergo.driver +++ /dev/null @@ -1,2 +0,0 @@ -library INDEX: const -logic index INDEX_init = {coq="dumb"; altergo="const(0)"; why3="Flash.init"; } ; diff --git a/src/plugins/wp/tests/wp_plugin/flash.c b/src/plugins/wp/tests/wp_plugin/flash.c index 957b7a677555f5350e219743644a4507973b389b..f289baa8d10249b415dec0f9db6673c39c77b7de 100644 --- a/src/plugins/wp/tests/wp_plugin/flash.c +++ b/src/plugins/wp/tests/wp_plugin/flash.c @@ -1,15 +1,11 @@ /* run.config OPT: - DEPS: flash.mlw - OPT: -wp-driver %{dep:@PTEST_DIR@/flash.driver},%{dep:@PTEST_DIR@/flash-ergo.driver} SCRIPT: flash OPT: -wp-driver %{dep:@PTEST_DIR@/flash.driver} */ /* run.config_qualif OPT: -wp-timeout 1 - DEPS: flash.mlw - OPT: -wp-driver %{dep:@PTEST_DIR@/flash.driver},%{dep:@PTEST_DIR@/flash-ergo.driver} SCRIPT: @PTEST_NAME@ OPT: -wp-driver %{dep:@PTEST_DIR@/flash.driver} */ @@ -22,7 +18,7 @@ SCRIPT: @PTEST_NAME@ /*@ axiomatic EVENT { - type event = + type event = | RdAt_int(int *) | WrAt_int(int *) ; @@ -47,7 +43,7 @@ SCRIPT: @PTEST_NAME@ //@ghost int RD_time ; -/*@ +/*@ axiomatic RD { logic index RD_current{L} reads RD_time; logic index RD_update( index idx , int *p ) reads \nothing; @@ -73,7 +69,7 @@ int RD(int *p); //@ ghost int WR_time ; -/*@ +/*@ axiomatic WR { logic index WR_current{L} reads WR_time; logic index WR_update( index idx , int *p ) reads \nothing; diff --git a/src/plugins/wp/tests/wp_plugin/flash.driver b/src/plugins/wp/tests/wp_plugin/flash.driver index 9196ec9571aacbb4e95249cd9e79a57184b829bb..d4cd3511798bccf8f84f19dd35017f81eb415d30 100644 --- a/src/plugins/wp/tests/wp_plugin/flash.driver +++ b/src/plugins/wp/tests/wp_plugin/flash.driver @@ -1,8 +1,8 @@ library INDEX: memory why3.file += "flash.mlw"; -type index = {coq="dumb"; altergo="(addr,int)farray"; why3="Flash.t"; } ; -logic integer INDEX_access( index , addr ) = {coq="dumb"; altergo="(%1)[%2]"; why3="Flash.get"; } ; -logic index INDEX_update( index , addr ) = {coq="dumb"; altergo="((%1)[(%2) <- (%1)[%2]+1])"; why3="Flash.update"}; +type index = {why3="Flash.t"; } ; +logic integer INDEX_access( index , addr ) = {why3="Flash.get"; } ; +logic index INDEX_update( index , addr ) = {why3="Flash.update"}; logic index INDEX_init := "INDEX_init" ; library RD: INDEX diff --git a/src/plugins/wp/tests/wp_plugin/flash.mlw b/src/plugins/wp/tests/wp_plugin/flash.mlw deleted file mode 100644 index 2d8a45bfb6c52f340992c99113318b4df4c8aba0..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/flash.mlw +++ /dev/null @@ -1,13 +0,0 @@ -module Flash - use map.Map - use map.Const - use int.Int - use frama_c_wp.memory.Memory - - type t = map addr int - - function get (m:t) (x:addr) : int = m[x] - function update (m:t) (x:addr) : t = m[ x <- (m[x] + 1) ] - - function init : t = const 0 -end diff --git a/src/plugins/wp/tests/wp_plugin/float_format.i b/src/plugins/wp/tests/wp_plugin/float_format.i index cdca1c6d758b266bfcef3b4a3727f19a234f8500..117574e517c0ddd4bd758787e23e77d1117ba4ff 100644 --- a/src/plugins/wp/tests/wp_plugin/float_format.i +++ b/src/plugins/wp/tests/wp_plugin/float_format.i @@ -1,6 +1,4 @@ /* run.config_qualif - OPT: -wp-prover native:coq - OPT: -wp-prover native:alt-ergo -wp-steps 5 -wp-timeout 100 OPT: -wp-prover alt-ergo -wp-steps 5 -wp-timeout 100 */ diff --git a/src/plugins/wp/tests/wp_plugin/inductive.c b/src/plugins/wp/tests/wp_plugin/inductive.c index fc52022bcb41ba6a0be668ad08de6a8d8a56406a..5fe98fae814e83f4c6533d9553266075fb930472 100644 --- a/src/plugins/wp/tests/wp_plugin/inductive.c +++ b/src/plugins/wp/tests/wp_plugin/inductive.c @@ -1,9 +1,9 @@ /* run.config - OPT: -wp-prover native:coq -wp-gen -wp-msg-key print-generated + OPT: -wp-prover why3 -wp-gen -wp-msg-key print-generated */ /* run.config_qualif - OPT: -wp-prover native:coq -wp-coq-script %{dep:@PTEST_DIR@/inductive.script} -wp-timeout 240 + DONTRUN: */ typedef struct _list { int element; struct _list* next; } list; @@ -42,11 +42,11 @@ typedef struct _list { int element; struct _list* next; } list; } */ -/*@ lemma test: - \forall list *root,*node; +/*@ lemma test: + \forall list *root,*node; reachable(root,node) ==> ( root == node || (\valid(root) && reachable(root->next, node)) ); */ -/*@ lemma offset{L1,L2} : +/*@ lemma offset{L1,L2} : \forall int *a, *b, integer begin, end, offset; same_elements{L1,L2}(a+offset,b+offset, begin, end) ==> same_elements{L1,L2}(a, b, begin+offset, end+offset); diff --git a/src/plugins/wp/tests/wp_plugin/inductive.script b/src/plugins/wp/tests/wp_plugin/inductive.script deleted file mode 100644 index d5d9adc636b9ab7cd2841f3bfdaa5c266c8770f2..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/inductive.script +++ /dev/null @@ -1,41 +0,0 @@ -(* Generated by Frama-C WP *) - -Goal typed_lemma_offset. -Hint offset,property. -Proof. - intros. remember (shift_sint32 a_1 i) as a_11. - remember (shift_sint32 a i) as a1. - revert dependent a. revert dependent a_1. - induction H; intros; subst. - - apply Q_refl. unfold P_same_array; intros. - unfold P_same_array in *. unfold shift_sint32, shift in *. - destruct a0, a_0. simpl in *. - replace i1 with (i + (i1 -i)) by omega. - rewrite 2!Z.add_assoc. - apply H; omega. - - apply Q_swap with (i_2:=i+i_2) (i_1:=i+i_1). unfold P_swap in *. - decompose [and] H; clear H. - unfold shift_sint32, shift in *. destruct a0, a_0. simpl in *. - repeat split; try omega. - + rewrite 2!Z.add_assoc. assumption. - + rewrite 2!Z.add_assoc. assumption. - + intros. - replace i_0 with (i + (i_0 - i)) by omega. - rewrite 2!Z.add_assoc. - apply H6; omega. - - apply Q_trans with (t_1:=t_1) (a_1:=shift_sint32 a_1 (-i)). - + apply IHP_same_elements1. destruct a_1; unfold shift_sint32, shift; simpl. f_equal; omega. reflexivity. - + apply IHP_same_elements2. reflexivity. destruct a_1; unfold shift_sint32, shift; simpl. f_equal; omega. -Qed. - -Goal typed_lemma_test. -Hint property,test. -Proof. -intros. -destruct H. - - left. reflexivity. - - right. split;assumption. -(* auto with zarith. *) -Qed. - - diff --git a/src/plugins/wp/tests/wp_plugin/math.i b/src/plugins/wp/tests/wp_plugin/math.i index d2a3d2ce303de8ef3b5c4f48ce0bcfa4b426570a..53a3106b4c5a605686807ae0bf937daa3a0c65db 100644 --- a/src/plugins/wp/tests/wp_plugin/math.i +++ b/src/plugins/wp/tests/wp_plugin/math.i @@ -3,10 +3,8 @@ */ /* run.config_qualif - OPT: -wp-prover alt-ergo -wp-prop=-ko -wp-timeout 100 -wp-steps 1500 - OPT: -wp-prover native:alt-ergo -wp-report=%{dep:@PTEST_SUITE_DIR@/../native.report} -wp-prop=-ko -wp-timeout 100 -wp-steps 1500 - OPT: -wp-prover alt-ergo -wp-prop=ko -wp-timeout 100 -wp-steps 10 - OPT: -wp-prover native:alt-ergo -wp-report=%{dep:@PTEST_SUITE_DIR@/../native.report} -wp-prop=ko -wp-timeout 100 -wp-steps 10 + OPT: -wp-prover alt-ergo -wp-prop=-ko -wp-timeout 100 -wp-steps 1500 + OPT: -wp-prover alt-ergo -wp-prop=ko -wp-timeout 100 -wp-steps 10 */ // -------------------------------------------------------------------------- @@ -63,7 +61,7 @@ // --- Polar // -------------------------------------------------------------------------- -//@ lemma distance: \forall real x,y; \hypot(x,y) == \sqrt( x*x + y*y ); +//@ lemma distance: \forall real x,y; \hypot(x,y) == \sqrt( x*x + y*y ); // -------------------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/nth.i b/src/plugins/wp/tests/wp_plugin/nth.i index 3e5a1d4e75d247e894c07d6e09395a0d3c7bdf92..33236ef838299d9fff8a9616d03b62b76f261b9c 100644 --- a/src/plugins/wp/tests/wp_plugin/nth.i +++ b/src/plugins/wp/tests/wp_plugin/nth.i @@ -3,8 +3,85 @@ */ /*@ - axiomatic Nth { + axiomatic Def { + logic integer f(integer a); + logic integer N; + logic integer M; + logic \list<integer> S; + logic \list<integer> A; + logic \list<integer> B; + logic \list<integer> C; + + logic \list<integer> empty = \Nil; + predicate IsEmpty(\list<integer> s) = s == empty; + + predicate P(\list<integer> s) reads \nothing; + + } +*/ + +/*@ + axiomatic MkRepeat { + + check lemma negative_repeat: ok: P( A *^ 0 ) <==> P( S *^ (-1) ) ; + check lemma repeat_nil: ok: P( A *^ 0 ) <==> P( (S *^ 0) *^ N ); + check lemma repeat_one: ok: P( S *^ 1 ) <==> P( S ); + check lemma repeat_repeated: ok: P( (S *^ ((N&1)) *^ (M&2)) ) <==> P( S *^ ((N&1) * (M&2)) ); + + } +*/ + +/*@ + axiomatic Equality { + + check lemma constructor_elt: ok: [| 1 |] != [| 2 |] ; + + check lemma not_nil_elt: ok: ([| 1 |] ^ A) != A ; + + + check lemma repeat1: ok: (S *^ N) == (S *^ M) + <==> ( N == M || ( ((S *^ N) ^ A) == A && ((S *^ M) ^ A) == A ) ) ; + + check lemma repeat2: ok: ( ((S *^ N) ^ S) *^ M ) == ( ( S ^ (S *^ N)) *^ M ) ; + + check lemma left_shift_repeat1: ok: ( ((S ^ A ^ B) *^ N) ^ S ^ A ) == (S ^ C) + <==> ( ( (A ^ B ^ S) *^ N) ^ A ) == ( C); + check lemma left_unfold_repeat1: ok: ( ((S ^ A ^ B) *^ 3) ^ A ^ S ) == (S ^ C) + <==> ( A ^ B ^ ((S ^ A ^ B) *^ 2) ^ A ^ S ) == ( C); + + check lemma right_shift_repeat1: ok: ( A ^ S ^ ((B ^ A ^ S) *^ N) ) == (C ^ S) + <==> ( A ^ ((S ^ B ^ A ) *^ N) ) == (C ); + check lemma right_unfold_repeat1: ok: ( S ^ A ^ ((B ^ A ^ S) *^ 3) ) == (C ^ S) + <==> ( S ^ A ^ ((B ^ A ^ S) *^ 2) ^ B ^ A) == (C ); + + + check lemma left_shift_repeat2: ok: ( ((S ^ A ^ B) *^ N) ^ S ^ A ^ C) == (S ^ A) + <==> ( (C ^ S) == S && (N<=0 || (A ^ B ^ S ^ S) == S) ); + check lemma left_unfold_repeat2: ok: ( ((S ^ A ^ B) *^ 3) ^ C) == (S ^ A) + <==> (A ^ A ^ B ^ C ^ S) == A ; + + check lemma right_shift_repeat2: ok: ( C ^ A ^ S ^ ((B ^ A ^ S) *^ N) ) == (A ^ S) + <==> ( (C ^ S) == S && (N<=0 || (A ^ B ^ S ^ S) == S) ); + check lemma right_unfold_repeat2: ok: ( C ^ ((B ^ A ^ S) *^ 3) ) == (A ^ S) + <==> (A ^ B ^ C ^ S ^ S) == S ; + + + check lemma subsequence1: ok: ( A ^ (S *^ N) ^ B ^ S ^ C ) == ( (S *^ N) ^ S ) + <==> ( A ^ B ^ C ^ C ) == C ; + + } +*/ + +/*@ + axiomatic Nth { + + check lemma nth_repeat_undefined_1: ko: \nth ( [| f(0), f(1), f(2), f(3) |] *^ 3, 12 ) == f(0); + + check lemma nth_repeat_1: ok: \nth ( [| f(0), f(1), f(2), f(3) |] *^ 3, 0 ) == f(0); + check lemma nth_repeat_2: ok: \nth ( [| f(0), f(1), f(2), f(3) |] *^ 3, 11 ) == f(3); + check lemma nth_repeat_3: ok: \nth ( ([| f(0), f(1), f(2), f(3) |] *^ 3) ^ [| f(12) |] , 12 ) == f(12); + check lemma nth_repeat_4: ok: \nth ( ([| f(0), f(1), f(2), f(3) |] *^ 3) ^ [| f(12),f(13),f(14)|] ^ S, 13 ) == f(13); lemma access_16_16: ok: \forall integer k ; 0 <= k < 16 ==> @@ -15,12 +92,12 @@ \forall integer k ; 0 <= k < 4 ==> f(k)==\nth([| f(0), f(1), f(2), f(3) |], k); - lemma eq_repeat_concat_3: ok: - \forall \list<integer> x ; (x *^ 3) == (x ^ x ^ x) ; + lemma eq_repeat_concat_3: ok: (S *^ 3) == (S ^ S ^ S) ; lemma access_repeat_concat_3: ok: lack: - \forall \list<integer> x ; - \forall integer k ; 0 <= k < 3*\length(x) ==> \nth(x *^ 3, k) == \nth(x ^ x ^ x, k) ; + \forall integer k ; 0 <= k < 3*\length(S) ==> \nth(S *^ 3, k) == \nth(S ^ S ^ S, k) ; } + + */ diff --git a/src/plugins/wp/tests/wp_plugin/oracle/abs.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/abs.res.oracle index ff56ccd82d47ba9925f56af23dc6b638f2cea456..2bfda3e2447475511ce53a7f9cfa432ee664b45f 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/abs.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/abs.res.oracle @@ -6,7 +6,7 @@ Function abs ------------------------------------------------------------ -Goal Post-condition (file abs.i, line 15) in 'abs': +Goal Post-condition (file abs.i, line 13) in 'abs': Assume { Type: is_sint32(abs_0) /\ is_sint32(x). If x < 0 diff --git a/src/plugins/wp/tests/wp_plugin/oracle/dynamic.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/dynamic.0.res.oracle index 9d876e37568607a728687a7270d23c68e777088a..2f88edb1b0627c657c8fc40f61b990172364e794 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/dynamic.0.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/dynamic.0.res.oracle @@ -23,7 +23,7 @@ Assume { (* Heap *) Type: (region(closure_0.base) <= 0) /\ framed(Mptr_0). (* Pre-condition *) - Have: (a = a_1) \/ ((a = a_2) /\ (abs_int(x) <= 5)). + Have: (a = a_1) \/ ((a = a_2) /\ (IAbs.abs(x) <= 5)). } Prove: (a = a_2) \/ (a = a_1). @@ -50,7 +50,7 @@ Assume { (* Heap *) Type: (region(closure_0.base) <= 0) /\ framed(Mptr_0). (* Pre-condition *) - Have: abs_int(x) <= 5. + Have: IAbs.abs(x) <= 5. (* Instance of 'f1' *) (* Call point f1 f2 *) Have: Mptr_0[shiftfield_F1_S_f(closure_0)] = global(G_f1_22). diff --git a/src/plugins/wp/tests/wp_plugin/oracle/flash.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/flash.1.res.oracle index 4ec72a463c8f85457c62723f2c2d9a4002f0ab78..f8d847b6ba4862b3d75a7ae339fe60a4414f0ef7 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/flash.1.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/flash.1.res.oracle @@ -1,7 +1,6 @@ # frama-c -wp [...] [kernel] Parsing flash.c (with preprocessing) [wp] Running WP plugin... -[wp] flash-ergo.driver:2: Warning: Redefinition of logic INDEX_init [wp] Warning: Missing RTE guards ------------------------------------------------------------ Function job @@ -13,252 +12,26 @@ Prove: true. ------------------------------------------------------------ Goal Post-condition 'A_reads' in 'job': -Let x = 1 + OBSERVER_time_0. -Let a = global(G_a_64). -Let a_1 = C_RdAt_int(a). -Let a_2 = global(G_b_65). -Let a_3 = C_RdAt_int(a_2). -Let a_4 = C_WrAt_int(a_2). -Let a_5 = ((const(0))[(a) <- (const(0))[a]+1]). -Let a_6 = ((a_5)[(a_2) <- (a_5)[a_2]+1]). -Let a_7 = ((a_6)[(a) <- (a_6)[a]+1]). -Let x_1 = 1 + RD_time_0. -Let x_2 = 1 + WR_time_0. -Let x_3 = OBSERVER_time_0 - 1. -Let x_4 = RD_time_0 - 1. -Let a_8 = L_RD_current(x_4). -Let x_5 = OBSERVER_time_0 - 2. -Let x_6 = L_RD_value(a, (const(0))[a]). -Let x_7 = x_6 + L_RD_value(a_2, (a_8)[a_2]). -Let x_8 = RD_time_0 - 2. -Let x_9 = OBSERVER_time_0 - 3. -Let x_10 = L_RD_value(a_2, (a_5)[a_2]). -Let x_11 = L_RD_value(a, (a_6)[a]). -Assume { - Type: is_sint32(OBSERVER_time_0) /\ is_sint32(RD_time_0) /\ - is_sint32(WR_time_0) /\ is_sint32(x_9) /\ is_sint32(x_5) /\ - is_sint32(x_8) /\ is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(x) /\ - is_sint32(x_1) /\ is_sint32(x_2) /\ is_sint32(x_6) /\ - is_sint32(x_10) /\ is_sint32(x_11) /\ is_sint32(x_7) /\ - is_sint32(x_6 + x_10 + x_11). - (* Pre-condition *) - Have: L_OBSERVER(x_9) = nil. - (* Pre-condition *) - Have: L_RD_current(x_8) = const(0). - (* Pre-condition *) - Have: L_WR_current(WR_time_0) = const(0). - (* Call 'RD' *) - Have: (a_8 = a_5) /\ (L_OBSERVER(x_5) = [ a_1 ]) /\ - (x_7 = L_WR_value(a_2, (const(0))[a_2])). - (* Call 'RD' *) - Have: (a_6 = L_RD_current(RD_time_0)) /\ (L_OBSERVER(x_3) = [ a_1, a_3 ]). - (* Call 'WR' *) - Have: (L_WR_current(x_2) = ((const(0))[(a_2) <- (const(0))[a_2]+1])) /\ - (L_OBSERVER(OBSERVER_time_0) = [ a_1, a_3, a_4 ]). - (* Call 'RD' *) - Have: (L_OBSERVER(x) = [ a_1, a_3, a_4, a_1 ]) /\ - (a_7 = L_RD_current(x_1)). -} -Prove: (a_7)[a] = 2. +Prove: true. ------------------------------------------------------------ Goal Post-condition 'B_reads' in 'job': -Let x = 1 + OBSERVER_time_0. -Let a = global(G_a_64). -Let a_1 = C_RdAt_int(a). -Let a_2 = global(G_b_65). -Let a_3 = C_RdAt_int(a_2). -Let a_4 = C_WrAt_int(a_2). -Let a_5 = ((const(0))[(a) <- (const(0))[a]+1]). -Let a_6 = ((a_5)[(a_2) <- (a_5)[a_2]+1]). -Let a_7 = ((a_6)[(a) <- (a_6)[a]+1]). -Let x_1 = 1 + RD_time_0. -Let x_2 = 1 + WR_time_0. -Let x_3 = OBSERVER_time_0 - 1. -Let x_4 = RD_time_0 - 1. -Let a_8 = L_RD_current(x_4). -Let x_5 = OBSERVER_time_0 - 2. -Let x_6 = L_RD_value(a, (const(0))[a]). -Let x_7 = x_6 + L_RD_value(a_2, (a_8)[a_2]). -Let x_8 = RD_time_0 - 2. -Let x_9 = OBSERVER_time_0 - 3. -Let x_10 = L_RD_value(a_2, (a_5)[a_2]). -Let x_11 = L_RD_value(a, (a_6)[a]). -Assume { - Type: is_sint32(OBSERVER_time_0) /\ is_sint32(RD_time_0) /\ - is_sint32(WR_time_0) /\ is_sint32(x_9) /\ is_sint32(x_5) /\ - is_sint32(x_8) /\ is_sint32(x_3) /\ is_sint32(x_4) /\ is_sint32(x) /\ - is_sint32(x_1) /\ is_sint32(x_2) /\ is_sint32(x_6) /\ - is_sint32(x_10) /\ is_sint32(x_11) /\ is_sint32(x_7) /\ - is_sint32(x_6 + x_10 + x_11). - (* Pre-condition *) - Have: L_OBSERVER(x_9) = nil. - (* Pre-condition *) - Have: L_RD_current(x_8) = const(0). - (* Pre-condition *) - Have: L_WR_current(WR_time_0) = const(0). - (* Call 'RD' *) - Have: (a_8 = a_5) /\ (L_OBSERVER(x_5) = [ a_1 ]) /\ - (x_7 = L_WR_value(a_2, (const(0))[a_2])). - (* Call 'RD' *) - Have: (a_6 = L_RD_current(RD_time_0)) /\ (L_OBSERVER(x_3) = [ a_1, a_3 ]). - (* Call 'WR' *) - Have: (L_WR_current(x_2) = ((const(0))[(a_2) <- (const(0))[a_2]+1])) /\ - (L_OBSERVER(OBSERVER_time_0) = [ a_1, a_3, a_4 ]). - (* Call 'RD' *) - Have: (L_OBSERVER(x) = [ a_1, a_3, a_4, a_1 ]) /\ - (a_7 = L_RD_current(x_1)). -} -Prove: (a_7)[a_2] = 1. +Prove: true. ------------------------------------------------------------ Goal Post-condition 'B_writes' in 'job': -Let x = 1 + OBSERVER_time_0. -Let a = global(G_a_64). -Let a_1 = C_RdAt_int(a). -Let a_2 = global(G_b_65). -Let a_3 = C_RdAt_int(a_2). -Let a_4 = C_WrAt_int(a_2). -Let a_5 = ((const(0))[(a) <- (const(0))[a]+1]). -Let a_6 = ((a_5)[(a_2) <- (a_5)[a_2]+1]). -Let x_1 = 1 + WR_time_0. -Let a_7 = ((const(0))[(a_2) <- (const(0))[a_2]+1]). -Let x_2 = RD_time_0 - 1. -Let x_3 = OBSERVER_time_0 - 1. -Let x_4 = RD_time_0 - 2. -Let a_8 = L_RD_current(x_4). -Let x_5 = OBSERVER_time_0 - 2. -Let x_6 = L_RD_value(a, (const(0))[a]). -Let x_7 = x_6 + L_RD_value(a_2, (a_8)[a_2]). -Let x_8 = RD_time_0 - 3. -Let x_9 = OBSERVER_time_0 - 3. -Let x_10 = L_RD_value(a_2, (a_5)[a_2]). -Let x_11 = L_RD_value(a, (a_6)[a]). -Assume { - Type: is_sint32(OBSERVER_time_0) /\ is_sint32(RD_time_0) /\ - is_sint32(WR_time_0) /\ is_sint32(x_9) /\ is_sint32(x_8) /\ - is_sint32(x_5) /\ is_sint32(x_4) /\ is_sint32(x_3) /\ is_sint32(x_2) /\ - is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(x_6) /\ is_sint32(x_10) /\ - is_sint32(x_11) /\ is_sint32(x_7) /\ is_sint32(x_6 + x_10 + x_11). - (* Pre-condition *) - Have: L_OBSERVER(x_9) = nil. - (* Pre-condition *) - Have: L_RD_current(x_8) = const(0). - (* Pre-condition *) - Have: L_WR_current(WR_time_0) = const(0). - (* Call 'RD' *) - Have: (a_8 = a_5) /\ (L_OBSERVER(x_5) = [ a_1 ]) /\ - (x_7 = L_WR_value(a_2, (const(0))[a_2])). - (* Call 'RD' *) - Have: (a_6 = L_RD_current(x_2)) /\ (L_OBSERVER(x_3) = [ a_1, a_3 ]). - (* Call 'WR' *) - Have: (L_WR_current(x_1) = a_7) /\ - (L_OBSERVER(OBSERVER_time_0) = [ a_1, a_3, a_4 ]). - (* Call 'RD' *) - Have: (L_OBSERVER(x) = [ a_1, a_3, a_4, a_1 ]) /\ - (((a_6)[(a) <- (a_6)[a]+1]) = L_RD_current(RD_time_0)). -} -Prove: (a_7)[a_2] = 1. +Prove: true. ------------------------------------------------------------ Goal Post-condition 'ReadValues' in 'job': -Let x = 1 + OBSERVER_time_0. -Let a = global(G_a_64). -Let a_1 = C_RdAt_int(a). -Let a_2 = global(G_b_65). -Let a_3 = C_RdAt_int(a_2). -Let a_4 = C_WrAt_int(a_2). -Let a_5 = ((const(0))[(a) <- (const(0))[a]+1]). -Let a_6 = ((a_5)[(a_2) <- (a_5)[a_2]+1]). -Let x_1 = 1 + WR_time_0. -Let x_2 = RD_time_0 - 1. -Let x_3 = OBSERVER_time_0 - 1. -Let x_4 = RD_time_0 - 2. -Let a_7 = L_RD_current(x_4). -Let x_5 = OBSERVER_time_0 - 2. -Let x_6 = L_RD_value(a, (const(0))[a]). -Let x_7 = x_6 + L_RD_value(a_2, (a_7)[a_2]). -Let x_8 = RD_time_0 - 3. -Let x_9 = OBSERVER_time_0 - 3. -Let x_10 = L_RD_value(a_2, (a_5)[a_2]). -Let x_11 = L_RD_value(a, (a_6)[a]). -Let x_12 = x_6 + x_10 + x_11. -Assume { - Type: is_sint32(OBSERVER_time_0) /\ is_sint32(RD_time_0) /\ - is_sint32(WR_time_0) /\ is_sint32(x_9) /\ is_sint32(x_8) /\ - is_sint32(x_5) /\ is_sint32(x_4) /\ is_sint32(x_3) /\ is_sint32(x_2) /\ - is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(x_6) /\ is_sint32(x_10) /\ - is_sint32(x_11) /\ is_sint32(x_7) /\ is_sint32(x_12). - (* Pre-condition *) - Have: L_OBSERVER(x_9) = nil. - (* Pre-condition *) - Have: L_RD_current(x_8) = const(0). - (* Pre-condition *) - Have: L_WR_current(WR_time_0) = const(0). - (* Call 'RD' *) - Have: (a_7 = a_5) /\ (L_OBSERVER(x_5) = [ a_1 ]) /\ - (x_7 = L_WR_value(a_2, (const(0))[a_2])). - (* Call 'RD' *) - Have: (a_6 = L_RD_current(x_2)) /\ (L_OBSERVER(x_3) = [ a_1, a_3 ]). - (* Call 'WR' *) - Have: (L_WR_current(x_1) = ((const(0))[(a_2) <- (const(0))[a_2]+1])) /\ - (L_OBSERVER(OBSERVER_time_0) = [ a_1, a_3, a_4 ]). - (* Call 'RD' *) - Have: (L_OBSERVER(x) = [ a_1, a_3, a_4, a_1 ]) /\ - (((a_6)[(a) <- (a_6)[a]+1]) = L_RD_current(RD_time_0)). -} -Prove: x_12 = (L_RD_value(a, 0) + L_RD_value(a, 1) + L_RD_value(a_2, 0)). +Prove: true. ------------------------------------------------------------ Goal Post-condition 'WriteValues' in 'job': -Let x = 1 + OBSERVER_time_0. -Let a = global(G_a_64). -Let a_1 = C_RdAt_int(a). -Let a_2 = global(G_b_65). -Let a_3 = C_RdAt_int(a_2). -Let a_4 = C_WrAt_int(a_2). -Let a_5 = ((const(0))[(a) <- (const(0))[a]+1]). -Let a_6 = ((a_5)[(a_2) <- (a_5)[a_2]+1]). -Let x_1 = 1 + WR_time_0. -Let x_2 = RD_time_0 - 1. -Let x_3 = OBSERVER_time_0 - 1. -Let x_4 = RD_time_0 - 2. -Let a_7 = L_RD_current(x_4). -Let x_5 = OBSERVER_time_0 - 2. -Let x_6 = L_RD_value(a, (const(0))[a]). -Let x_7 = x_6 + L_RD_value(a_2, (a_7)[a_2]). -Let x_8 = RD_time_0 - 3. -Let x_9 = OBSERVER_time_0 - 3. -Let x_10 = L_RD_value(a_2, (a_5)[a_2]). -Let x_11 = L_RD_value(a, (a_6)[a]). -Assume { - Type: is_sint32(OBSERVER_time_0) /\ is_sint32(RD_time_0) /\ - is_sint32(WR_time_0) /\ is_sint32(x_9) /\ is_sint32(x_8) /\ - is_sint32(x_5) /\ is_sint32(x_4) /\ is_sint32(x_3) /\ is_sint32(x_2) /\ - is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(x_6) /\ is_sint32(x_10) /\ - is_sint32(x_11) /\ is_sint32(x_7) /\ is_sint32(x_6 + x_10 + x_11). - (* Pre-condition *) - Have: L_OBSERVER(x_9) = nil. - (* Pre-condition *) - Have: L_RD_current(x_8) = const(0). - (* Pre-condition *) - Have: L_WR_current(WR_time_0) = const(0). - (* Call 'RD' *) - Have: (a_7 = a_5) /\ (L_OBSERVER(x_5) = [ a_1 ]) /\ - (x_7 = L_WR_value(a_2, (const(0))[a_2])). - (* Call 'RD' *) - Have: (a_6 = L_RD_current(x_2)) /\ (L_OBSERVER(x_3) = [ a_1, a_3 ]). - (* Call 'WR' *) - Have: (L_WR_current(x_1) = ((const(0))[(a_2) <- (const(0))[a_2]+1])) /\ - (L_OBSERVER(OBSERVER_time_0) = [ a_1, a_3, a_4 ]). - (* Call 'RD' *) - Have: (L_OBSERVER(x) = [ a_1, a_3, a_4, a_1 ]) /\ - (((a_6)[(a) <- (a_6)[a]+1]) = L_RD_current(RD_time_0)). -} -Prove: (L_RD_value(a, 0) + L_RD_value(a_2, 0)) = L_WR_value(a_2, 0). +Prove: true. ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_plugin/oracle/flash.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/flash.2.res.oracle deleted file mode 100644 index f8d847b6ba4862b3d75a7ae339fe60a4414f0ef7..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/oracle/flash.2.res.oracle +++ /dev/null @@ -1,37 +0,0 @@ -# frama-c -wp [...] -[kernel] Parsing flash.c (with preprocessing) -[wp] Running WP plugin... -[wp] Warning: Missing RTE guards ------------------------------------------------------------- - Function job ------------------------------------------------------------- - -Goal Post-condition 'Events' in 'job': -Prove: true. - ------------------------------------------------------------- - -Goal Post-condition 'A_reads' in 'job': -Prove: true. - ------------------------------------------------------------- - -Goal Post-condition 'B_reads' in 'job': -Prove: true. - ------------------------------------------------------------- - -Goal Post-condition 'B_writes' in 'job': -Prove: true. - ------------------------------------------------------------- - -Goal Post-condition 'ReadValues' in 'job': -Prove: true. - ------------------------------------------------------------- - -Goal Post-condition 'WriteValues' in 'job': -Prove: true. - ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/oracle/float_format.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/float_format.res.oracle index de8342d87a74aa1c4d12bb1bd09b641a3bce47b3..86587426f43e2a50822707fa7feace8c84912896 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/float_format.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/float_format.res.oracle @@ -1,6 +1,6 @@ # frama-c -wp [...] [kernel] Parsing float_format.i (no preprocessing) -[kernel:parser:decimal-float] float_format.i:10: Warning: +[kernel:parser:decimal-float] float_format.i:8: Warning: Floating-point constant 0.2 is not represented exactly. Will use 0x1.999999999999ap-3. (warn-once: no further messages from category 'parser:decimal-float' will be emitted) [wp] Running WP plugin... diff --git a/src/plugins/wp/tests/wp_plugin/oracle/float_real.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/float_real.0.res.oracle index 588faa27370308ab4412a90f3c566f962a7bedf4..bfaa684d0565a4a2762e379b709b4779591691d1 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/float_real.0.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/float_real.0.res.oracle @@ -20,6 +20,6 @@ Assume { } Else { Have: dequal_0 = 0. } } -Prove: (abs_real(x - y) < (1.0/100000)) <-> (dequal_0 != 0). +Prove: (RAbs.abs(x - y) < (1.0/100000)) <-> (dequal_0 != 0). ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_plugin/oracle/float_real.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/float_real.1.res.oracle index 263fd5d0c43900e7a6d64787c9ad65b8bd993db1..03a072084a991d573a6a568978f069f865100fa3 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/float_real.1.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/float_real.1.res.oracle @@ -22,6 +22,6 @@ Assume { } Else { Have: dequal_0 = 0. } } -Prove: (abs_real(of_f64(x) - of_f64(y)) < (1.0/100000)) <-> (dequal_0 != 0). +Prove: (RAbs.abs(of_f64(x) - of_f64(y)) < (1.0/100000)) <-> (dequal_0 != 0). ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_plugin/oracle/inductive.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/inductive.res.oracle index 682a46a629d55a852430add96b479063d9d0821c..973a39e45fa5af1ba55ed02d29a1bfe1666b0a7a 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/inductive.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/inductive.res.oracle @@ -1,176 +1,149 @@ # frama-c -wp [...] [kernel] Parsing inductive.c (with preprocessing) [wp] Running WP plugin... -[wp] Warning: native support for coq is deprecated, use tip instead [wp] 2 goals scheduled -[wp:print-generated] - "WPOUT/typed/Compound.v" - (* ---------------------------------------------------------- *) - (* --- Memory Compound Loader --- *) - (* ---------------------------------------------------------- *) - - Require Import ZArith. - Require Import Reals. - Require Import BuiltIn. - Require Import bool.Bool. - Require Import HighOrd. - Require Import int.Int. - Require Import int.Abs. - Require Import int.ComputerDivision. - Require Import int.EuclideanDivision. - Require Import int.ComputerOfEuclideanDivision. - Require Import real.Real. - Require Import real.RealInfix. - Require Import real.FromInt. - Require Import map.Map. - Require Import bool.Bool. - Require Import Qedlib. - Require Import Qed. - Require Import Memory. +--------------------------------------------- +--- Context 'typed' Cluster 'Compound' +--------------------------------------------- +theory Compound + (* use why3.BuiltIn.BuiltIn *) - Definition shift_sint32 (p : addr) (k : Z) : addr := (shift p k%Z). - - Definition shiftfield_F1__list_next (p : addr) : addr := (shift p 1%Z). -[wp:print-generated] - "WPOUT/typed/lemma_test_Coq.v" - (* ---------------------------------------------------------- *) - (* --- Lemma 'test' --- *) - (* ---------------------------------------------------------- *) - Require Import ZArith. - Require Import Reals. - Require Import BuiltIn. - Require Import bool.Bool. - Require Import HighOrd. - Require Import int.Int. - Require Import int.Abs. - Require Import int.ComputerDivision. - Require Import int.EuclideanDivision. - Require Import int.ComputerOfEuclideanDivision. - Require Import real.Real. - Require Import real.RealInfix. - Require Import real.FromInt. - Require Import map.Map. - Require Import bool.Bool. - Require Import Qedlib. - Require Import Qed. + (* use bool.Bool *) - (* --- Global Definitions --- *) - Require Import Memory. + (* use int.Int *) - Require Import Compound. + (* use int.ComputerDivision *) - Inductive P_reachable : array Z -> farray addr addr -> addr -> addr -> - Prop := - | Q_root_reachable: forall (t : array Z), - forall (t_1 : farray addr addr), forall (a : addr), - (P_reachable t t_1 a a) - | Q_next_reachable: forall (t : array Z), - forall (t_1 : farray addr addr), forall (a_1 a : addr), - ((valid_rw t a_1 2%Z)) -> - ((P_reachable t t_1 (t_1.[ (shiftfield_F1__list_next a_1) ]) a)) -> - ((P_reachable t t_1 a_1 a)). - - Goal - forall (t : array Z), - forall (t_1 : farray addr addr), - forall (a_1 a : addr), - ((P_reachable t t_1 a_1 a)) -> - ((a_1 = a) \/ - (((valid_rw t a_1 2%Z)) /\ - ((P_reachable t t_1 (t_1.[ (shiftfield_F1__list_next a_1) ]) a)))). - - Proof. - ... - Qed. -[wp:print-generated] - "WPOUT/typed/lemma_offset_Coq.v" - (* ---------------------------------------------------------- *) - (* --- Lemma 'offset' --- *) - (* ---------------------------------------------------------- *) - Require Import ZArith. - Require Import Reals. - Require Import BuiltIn. - Require Import bool.Bool. - Require Import HighOrd. - Require Import int.Int. - Require Import int.Abs. - Require Import int.ComputerDivision. - Require Import int.EuclideanDivision. - Require Import int.ComputerOfEuclideanDivision. - Require Import real.Real. - Require Import real.RealInfix. - Require Import real.FromInt. - Require Import map.Map. - Require Import bool.Bool. - Require Import Qedlib. - Require Import Qed. + (* use real.RealInfix *) - (* --- Global Definitions --- *) - Require Import Memory. + (* use frama_c_wp.qed.Qed *) - Require Import Compound. + (* use map.Map *) - Inductive P_reachable : array Z -> farray addr addr -> addr -> addr -> - Prop := - | Q_root_reachable: forall (t : array Z), - forall (t_1 : farray addr addr), forall (a : addr), - (P_reachable t t_1 a a) - | Q_next_reachable: forall (t : array Z), - forall (t_1 : farray addr addr), forall (a_1 a : addr), - ((valid_rw t a_1 2%Z)) -> - ((P_reachable t t_1 (t_1.[ (shiftfield_F1__list_next a_1) ]) a)) -> - ((P_reachable t t_1 a_1 a)). + (* use frama_c_wp.memory.Memory *) - Hypothesis Q_test: forall (t : array Z), forall (t_1 : farray addr addr), - forall (a_1 a : addr), ((P_reachable t t_1 a_1 a)) -> - ((a_1 = a) \/ - (((valid_rw t a_1 2%Z)) /\ - ((P_reachable t t_1 (t_1.[ (shiftfield_F1__list_next a_1) ]) a)))). + function shift_sint32 (p:addr) (k:int) : addr = shift p k - Definition P_same_array (Mint_0 : farray addr Z) (Mint_1 : farray addr Z) - (a : addr) (b : addr) (begin_0 : Z) (end_0 : Z) : Prop := - forall (i : Z), ((begin_0 <= i)%Z) -> ((i < end_0)%Z) -> - (((Mint_1.[ (shift_sint32 a i%Z) ]) - = (Mint_0.[ (shift_sint32 b i%Z) ]))%Z). - - Definition P_swap (Mint_0 : farray addr Z) (Mint_1 : farray addr Z) - (a : addr) (b : addr) (begin_0 : Z) (i : Z) (j : Z) (end_0 : Z) : Prop := - (((Mint_1.[ (shift_sint32 a i%Z) ]) - = (Mint_0.[ (shift_sint32 b j%Z) ]))%Z) /\ - (((Mint_1.[ (shift_sint32 a j%Z) ]) - = (Mint_0.[ (shift_sint32 b i%Z) ]))%Z) /\ ((begin_0 <= i)%Z) /\ - ((i < j)%Z) /\ ((j < end_0)%Z) /\ - (forall (i_1 : Z), ((i_1 <> i)%Z) -> ((i_1 <> j)%Z) -> - ((begin_0 <= i_1)%Z) -> ((i_1 < end_0)%Z) -> - (((Mint_1.[ (shift_sint32 a i_1%Z) ]) - = (Mint_0.[ (shift_sint32 b i_1%Z) ]))%Z)). - - Inductive P_same_elements : farray addr Z -> farray addr Z -> addr -> addr -> - Z -> Z -> Prop := - | Q_refl: forall (i_1 i : Z), forall (t_1 t : farray addr Z), - forall (a_1 a : addr), ((P_same_array t_1 t a_1 a i_1%Z i%Z)) -> - ((P_same_elements t_1 t a_1 a i_1%Z i%Z)) - | Q_swap: forall (i_3 i_2 i_1 i : Z), forall (t_1 t : farray addr Z), - forall (a_1 a : addr), - ((P_swap t_1 t a_1 a i_3%Z i_2%Z i_1%Z i%Z)) -> - ((P_same_elements t_1 t a_1 a i_3%Z i%Z)) - | Q_trans: forall (i_1 i : Z), forall (t_2 t_1 t : farray addr Z), - forall (a_2 a_1 a : addr), - ((P_same_elements t_2 t_1 a_1 a i_1%Z i%Z)) -> - ((P_same_elements t_1 t a_2 a_1 i_1%Z i%Z)) -> - ((P_same_elements t_2 t a_2 a i_1%Z i%Z)). - - Goal - forall (i_2 i_1 i : Z), - forall (t_1 t : farray addr Z), - forall (a_1 a : addr), - ((P_same_elements t_1 t ((shift_sint32 a_1 i%Z)) ((shift_sint32 a i%Z)) - i_2%Z i_1%Z)) -> - ((P_same_elements t_1 t a_1 a (i%Z + i_2%Z)%Z (i%Z + i_1%Z)%Z)). - - Proof. - ... - Qed. + function shiftfield_F1__list_next (p:addr) : addr = shift p 1 +end +[wp:print-generated] + theory WP + (* use why3.BuiltIn.BuiltIn *) + + (* use bool.Bool *) + + (* use int.Int *) + + (* use int.ComputerDivision *) + + (* use real.RealInfix *) + + (* use frama_c_wp.qed.Qed *) + + (* use map.Map *) + + (* use frama_c_wp.memory.Memory *) + + (* use Compound *) + + inductive P_reachable (int -> int) (addr -> addr) addr addr = + | Q_root_reachable : + forall malloc:int -> int, mptr:addr -> addr, root:addr. + P_reachable malloc mptr root root + | Q_next_reachable : + forall malloc:int -> int, mptr:addr -> addr, root:addr, node:addr. + valid_rw malloc root 2 -> + P_reachable malloc mptr (get mptr (shiftfield_F1__list_next root)) + node -> P_reachable malloc mptr root node + + goal wp_goal : + forall t:int -> int, t1:addr -> addr, a:addr, a1:addr. + P_reachable t t1 a a1 -> + a1 = a \/ + valid_rw t a 2 /\ + P_reachable t t1 (get t1 (shiftfield_F1__list_next a)) a1 + end +[wp:print-generated] + theory WP1 + (* use why3.BuiltIn.BuiltIn *) + + (* use bool.Bool *) + + (* use int.Int *) + + (* use int.ComputerDivision *) + + (* use real.RealInfix *) + + (* use frama_c_wp.qed.Qed *) + + (* use map.Map *) + + (* use frama_c_wp.memory.Memory *) + + (* use Compound *) + + inductive P_reachable1 (int -> int) (addr -> addr) addr addr = + | Q_root_reachable1 : + forall malloc:int -> int, mptr:addr -> addr, root:addr. + P_reachable1 malloc mptr root root + | Q_next_reachable1 : + forall malloc:int -> int, mptr:addr -> addr, root:addr, node:addr. + valid_rw malloc root 2 -> + P_reachable1 malloc mptr (get mptr (shiftfield_F1__list_next root)) + node -> P_reachable1 malloc mptr root node + + lemma Q_test : + forall malloc:int -> int, mptr:addr -> addr, root:addr, node:addr. + P_reachable1 malloc mptr root node -> + root = node \/ + valid_rw malloc root 2 /\ + P_reachable1 malloc mptr (get mptr (shiftfield_F1__list_next root)) node + + predicate P_same_array (mint:addr -> int) (mint1:addr -> int) (a:addr) (b: + addr) (begin:int) (end1:int) = + forall i:int. + begin <= i -> + i < end1 -> get mint1 (shift_sint32 a i) = get mint (shift_sint32 b i) + + predicate P_swap (mint:addr -> int) (mint1:addr -> int) (a:addr) (b:addr) + (begin:int) (i:int) (j:int) (end1:int) = + ((((get mint1 (shift_sint32 a i) = get mint (shift_sint32 b j) /\ + get mint1 (shift_sint32 a j) = get mint (shift_sint32 b i)) /\ + begin <= i) /\ + i < j) /\ + j < end1) /\ + (forall i1:int. + not i1 = i -> + not j = i1 -> + begin <= i1 -> + i1 < end1 -> + get mint1 (shift_sint32 a i1) = get mint (shift_sint32 b i1)) + + inductive P_same_elements (addr -> int) (addr -> int) addr addr int int = + | Q_refl : + forall mint:addr -> int, mint1:addr -> int, a:addr, b:addr, begin: + int, end1:int. + P_same_array mint mint1 a b begin end1 -> + P_same_elements mint mint1 a b begin end1 + | Q_swap : + forall mint:addr -> int, mint1:addr -> int, a:addr, b:addr, begin: + int, i:int, j:int, end1:int. + P_swap mint mint1 a b begin i j end1 -> + P_same_elements mint mint1 a b begin end1 + | Q_trans : + forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, a: + addr, b:addr, c:addr, begin:int, end1:int. + P_same_elements mint mint1 b c begin end1 -> + P_same_elements mint1 mint2 a b begin end1 -> + P_same_elements mint mint2 a c begin end1 + + goal wp_goal : + forall t:addr -> int, t1:addr -> int, a:addr, a1:addr, i:int, i1:int, i2: + int. + P_same_elements t t1 (shift_sint32 a i2) (shift_sint32 a1 i2) i i1 -> + P_same_elements t t1 a a1 (i + i2) (i1 + i2) + end [wp] 2 goals generated ------------------------------------------------------------ Global diff --git a/src/plugins/wp/tests/wp_plugin/oracle/math.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/math.res.oracle index cdc664a97caad3fc04bd56c4474c1c7ebdd2d6fd..a6ca689bc81b26f3ccaf9aaa4ea1e23f0a15e627 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/math.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/math.res.oracle @@ -231,7 +231,7 @@ Prove: exp(log(r)) = r. ------------------------------------------------------------ Goal Post-condition 'min_plus_distrib' in 'ok': -Prove: (r + min_real(r_1, r_2)) = min_real(r_1 + r, r_2 + r). +Prove: (r + Rg.min(r_1, r_2)) = Rg.min(r_1 + r, r_2 + r). ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_plugin/oracle/nth.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/nth.res.oracle index 908af494da9eac274fa2f4293aa6379dc9accb7c..c93629cbb62d4b5fa92e4144cc23d6e0c1089cf1 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/nth.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/nth.res.oracle @@ -1,6 +1,97 @@ # frama-c -wp [...] [kernel] Parsing nth.i (no preprocessing) [wp] Running WP plugin... +------------------------------------------------------------ + Axiomatic 'Equality' +------------------------------------------------------------ + +Lemma constructor_elt: +Prove: true + +------------------------------------------------------------ + +Lemma left_shift_repeat1: +Prove: true + +------------------------------------------------------------ + +Lemma left_shift_repeat2: +Prove: true + +------------------------------------------------------------ + +Lemma left_unfold_repeat1: +Prove: true + +------------------------------------------------------------ + +Lemma left_unfold_repeat2: +Prove: true + +------------------------------------------------------------ + +Lemma not_nil_elt: +Prove: true + +------------------------------------------------------------ + +Lemma repeat1: +Prove: true + +------------------------------------------------------------ + +Lemma repeat2: +Prove: true + +------------------------------------------------------------ + +Lemma right_shift_repeat1: +Prove: true + +------------------------------------------------------------ + +Lemma right_shift_repeat2: +Prove: true + +------------------------------------------------------------ + +Lemma right_unfold_repeat1: +Prove: true + +------------------------------------------------------------ + +Lemma right_unfold_repeat2: +Prove: true + +------------------------------------------------------------ + +Lemma subsequence1: +Prove: true + +------------------------------------------------------------ +------------------------------------------------------------ + Axiomatic 'MkRepeat' +------------------------------------------------------------ + +Lemma negative_repeat: +Prove: true + +------------------------------------------------------------ + +Lemma repeat_nil: +Prove: true + +------------------------------------------------------------ + +Lemma repeat_one: +Prove: true + +------------------------------------------------------------ + +Lemma repeat_repeated: +Prove: true + +------------------------------------------------------------ ------------------------------------------------------------ Axiomatic 'Nth' ------------------------------------------------------------ @@ -27,8 +118,8 @@ Prove: (0<=k_0) -> (k_0<=3) Lemma access_repeat_concat_3: Assume: 'eq_repeat_concat_3' 'access_4_4' 'access_16_16' -Prove: (0<=k_0) -> (k_0<(3*(length x_0))) - -> ((nth (concat x_0 x_0 x_0) k_0)=(nth (repeat x_0 3) k_0)) +Prove: (0<=k_0) -> (k_0<(3*(length L_S))) + -> ((nth (concat L_S L_S L_S) k_0)=(nth (repeat L_S 3) k_0)) ------------------------------------------------------------ @@ -37,3 +128,31 @@ Assume: 'access_4_4' 'access_16_16' Prove: true ------------------------------------------------------------ + +Lemma nth_repeat_1: +Prove: true + +------------------------------------------------------------ + +Lemma nth_repeat_2: +Prove: true + +------------------------------------------------------------ + +Lemma nth_repeat_3: +Prove: true + +------------------------------------------------------------ + +Lemma nth_repeat_4: +Prove: true + +------------------------------------------------------------ + +Lemma nth_repeat_undefined_1: +Prove: let x_0 = (L_f 0) in + (nth + (repeat (concat (elt x_0) (elt (L_f 1)) (elt (L_f 2)) (elt (L_f 3))) + 3) 12)=x_0 + +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.0.res.oracle index 6758f5c2af389c91e2ac42aacc7c3d4716bd6156..8dea7878486065160e34eaf37406519d2dba1139 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/rte.0.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.0.res.oracle @@ -5,15 +5,15 @@ [wp:rte] function job: generate rte for division by zero [wp:rte] function job: generate rte for signed overflow [wp] Warning: -wp-rte can annotate invalid bool value because -warn-invalid-bool is not set -[rte] annotating function job +[rte:annot] annotating function job [wp:rte] function job2: generate rte for memory access [wp:rte] function job2: generate rte for division by zero [wp:rte] function job2: generate rte for signed overflow -[rte] annotating function job2 +[rte:annot] annotating function job2 [wp:rte] function job3: generate rte for memory access [wp:rte] function job3: generate rte for division by zero [wp:rte] function job3: generate rte for signed overflow -[rte] annotating function job3 +[rte:annot] annotating function job3 [wp] Warning: Missing RTE guards [wp] Goal typed_job_ensures : not tried [wp] Goal typed_job_assert_rte_mem_access : not tried diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.1.res.oracle index 5cb9e76206e07f7c982e840bb11552c20ee680db..cda4d24119fa289b279a889046d19551a934a6ac 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/rte.1.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.1.res.oracle @@ -4,15 +4,15 @@ [wp:rte] function job: generate rte for memory access [wp:rte] function job: generate rte for division by zero [wp:rte] function job: generate rte for invalid bool value -[rte] annotating function job +[rte:annot] annotating function job [wp:rte] function job2: generate rte for memory access [wp:rte] function job2: generate rte for division by zero [wp:rte] function job2: generate rte for invalid bool value -[rte] annotating function job2 +[rte:annot] annotating function job2 [wp:rte] function job3: generate rte for memory access [wp:rte] function job3: generate rte for division by zero [wp:rte] function job3: generate rte for invalid bool value -[rte] annotating function job3 +[rte:annot] annotating function job3 [wp] Goal typed_job_ensures : not tried [wp] Goal typed_job_assert_rte_mem_access : not tried [wp] Goal typed_job_assert_rte_mem_access_2 : not tried diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.2.res.oracle index f78e3c8930ce95f24ba6ea0847664d402e8a53a6..60b6829e7fa5e9351579f10187b566a71c6a0b79 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/rte.2.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.2.res.oracle @@ -6,19 +6,19 @@ [wp:rte] function job: generate rte for signed overflow [wp:rte] function job: generate rte for unsigned overflow [wp:rte] function job: generate rte for invalid bool value -[rte] annotating function job +[rte:annot] annotating function job [wp:rte] function job2: generate rte for memory access [wp:rte] function job2: generate rte for division by zero [wp:rte] function job2: generate rte for signed overflow [wp:rte] function job2: generate rte for unsigned overflow [wp:rte] function job2: generate rte for invalid bool value -[rte] annotating function job2 +[rte:annot] annotating function job2 [wp:rte] function job3: generate rte for memory access [wp:rte] function job3: generate rte for division by zero [wp:rte] function job3: generate rte for signed overflow [wp:rte] function job3: generate rte for unsigned overflow [wp:rte] function job3: generate rte for invalid bool value -[rte] annotating function job3 +[rte:annot] annotating function job3 [wp] Goal typed_job_ensures : not tried [wp] Goal typed_job_assert_rte_mem_access : not tried [wp] Goal typed_job_assert_rte_mem_access_2 : not tried diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.3.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.3.res.oracle index ca65238c06beb808941b138b80fe02065816b958..d34717c7fe54a38479169fecf5d92361e3ba8f33 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/rte.3.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.3.res.oracle @@ -8,17 +8,17 @@ [wp] Warning: -wp-rte and model nat require kernel to warn against signed downcast [wp] Warning: -wp-rte and model nat require kernel to warn against unsigned downcast [wp:rte] function job: generate rte for invalid bool value -[rte] annotating function job +[rte:annot] annotating function job [wp:rte] function job2: generate rte for memory access [wp:rte] function job2: generate rte for division by zero [wp:rte] function job2: generate rte for signed overflow [wp:rte] function job2: generate rte for invalid bool value -[rte] annotating function job2 +[rte:annot] annotating function job2 [wp:rte] function job3: generate rte for memory access [wp:rte] function job3: generate rte for division by zero [wp:rte] function job3: generate rte for signed overflow [wp:rte] function job3: generate rte for invalid bool value -[rte] annotating function job3 +[rte:annot] annotating function job3 [wp] Goal typed_nat_job_ensures : not tried [wp] Goal typed_nat_job_assert_rte_mem_access : not tried [wp] Goal typed_nat_job_assert_rte_mem_access_2 : not tried diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.4.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.4.res.oracle index d4211b890b2b0d7793c20f9d35ce225d18bfd9dc..73cd9373b426130604554cadfa94254f0bf2a19e 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/rte.4.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.4.res.oracle @@ -8,19 +8,19 @@ [wp] Warning: -wp-rte and model nat require kernel to warn against signed downcast [wp] Warning: -wp-rte and model nat require kernel to warn against unsigned downcast [wp:rte] function job: generate rte for invalid bool value -[rte] annotating function job +[rte:annot] annotating function job [wp:rte] function job2: generate rte for memory access [wp:rte] function job2: generate rte for division by zero [wp:rte] function job2: generate rte for signed overflow [wp:rte] function job2: generate rte for unsigned overflow [wp:rte] function job2: generate rte for invalid bool value -[rte] annotating function job2 +[rte:annot] annotating function job2 [wp:rte] function job3: generate rte for memory access [wp:rte] function job3: generate rte for division by zero [wp:rte] function job3: generate rte for signed overflow [wp:rte] function job3: generate rte for unsigned overflow [wp:rte] function job3: generate rte for invalid bool value -[rte] annotating function job3 +[rte:annot] annotating function job3 [wp] Goal typed_nat_job_ensures : not tried [wp] Goal typed_nat_job_assert_rte_mem_access : not tried [wp] Goal typed_nat_job_assert_rte_mem_access_2 : not tried diff --git a/src/plugins/wp/tests/wp_plugin/oracle/rte.6.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/rte.6.res.oracle index ab2f5f38105deb6dea776cc40aff3a7f66f30e1c..8dcc347a179ebd8f65416a939551a70232f28ebf 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/rte.6.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/rte.6.res.oracle @@ -8,15 +8,15 @@ [wp] Warning: -wp-rte and model nat require kernel to warn against signed downcast [wp] Warning: -wp-rte and model nat require kernel to warn against unsigned downcast [wp:rte] function job: generate rte for invalid bool value -[rte] annotating function job +[rte:annot] annotating function job [wp:rte] function job2: generate rte for division by zero [wp:rte] function job2: generate rte for signed overflow [wp:rte] function job2: generate rte for invalid bool value -[rte] annotating function job2 +[rte:annot] annotating function job2 [wp:rte] function job3: generate rte for division by zero [wp:rte] function job3: generate rte for signed overflow [wp:rte] function job3: generate rte for invalid bool value -[rte] annotating function job3 +[rte:annot] annotating function job3 [wp] Warning: Missing RTE guards [wp] Goal typed_nat_job_ensures : not tried [wp] Goal typed_nat_job_assert_rte_signed_overflow : not tried diff --git a/src/plugins/wp/tests/wp_plugin/oracle/sequence.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/sequence.res.oracle index eaf6561ef18ecbc197623780c17af09faa1eb1ba..fedcdb66fb660ab5c85989b6c35ce166281fa5ba 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle/sequence.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle/sequence.res.oracle @@ -34,7 +34,7 @@ Assume { (* Call 'f' *) Have: L_call_obs(call_seq_3) = a_1. } -Prove: nth(a_1, 1 + length(a)) = z. +Prove: nth(a_1, 1 + i) = z. ------------------------------------------------------------ @@ -181,30 +181,7 @@ Prove: true. ------------------------------------------------------------ Goal Post-condition for 'g_called' 'ok,u1' in 'loops': -Let a = ([ y ] *^ i). -Assume { - Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(x) /\ is_sint32(y) /\ - is_sint32(z). - (* Heap *) - Type: is_sint32(call_seq_0). - (* Pre-condition *) - Have: L_call_obs(call_seq_0) = nil. - (* Pre-condition for 'g_called' *) - Have: 0 < n. - (* Call 'f' *) - Have: L_call_obs(call_seq_1) = [ x ]. - (* Invariant 'ok,id_min' *) - Have: 0 <= i. - (* Invariant 'ok,id_max' *) - Have: i <= n. - (* Invariant 'ok,inv' *) - Have: L_call_obs(call_seq_2) = [ x ] ^ a. - (* Else *) - Have: n <= i. - (* Call 'f' *) - Have: L_call_obs(call_seq_3) = [ x ] ^ a ^ [ z ]. -} -Prove: length(a) = i. +Prove: true. ------------------------------------------------------------ @@ -240,7 +217,7 @@ Assume { (* Call 'f' *) Have: L_call_obs(call_seq_3) = [ x ] ^ a ^ [ z ]. } -Prove: length(a) = 0. +Prove: i = 0. ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.1.res.oracle deleted file mode 100644 index 146552b7f55e6cec0927dd4ce0cc23678597b4dc..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.1.res.oracle +++ /dev/null @@ -1,15 +0,0 @@ -# frama-c -wp [...] -[kernel] Parsing abs.i (no preprocessing) -[wp] Running WP plugin... -[wp] Warning: Missing RTE guards -[wp] Warning: native support for coq is deprecated, use tip instead -[wp] 1 goal scheduled -[wp] [Coq] Goal typed_abs_abs_ensures : Saved script -[wp] [Coq (native)] Goal typed_abs_abs_ensures : Valid -[wp] Proved goals: 1 / 1 - Qed: 0 - Coq (native): 1 ------------------------------------------------------------- - Functions WP Alt-Ergo Total Success - abs - - 1 100% ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.res.oracle similarity index 100% rename from src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.0.res.oracle rename to src/plugins/wp/tests/wp_plugin/oracle_qualif/abs.res.oracle diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.1.res.oracle deleted file mode 100644 index 7bd9172a0194f3c00e9b0a7735d563aa01a970fd..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.1.res.oracle +++ /dev/null @@ -1,18 +0,0 @@ -# frama-c -wp [...] -[kernel] Parsing convert.i (no preprocessing) -[wp] Running WP plugin... -[wp] Warning: native support for alt-ergo is deprecated, use why3 instead -[wp] 2 goals scheduled -[wp] [Alt-Ergo (native)] Goal typed_lemma_ceil : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_floor : Valid -[wp] Proved goals: 2 / 2 - Qed: 0 - Alt-Ergo (native): 2 ------------------------------------------------------------- - Axiomatics WP Alt-Ergo Total Success - Lemma - - 2 100% ------------------------------------------------------------- -------------------------------------------------------------- -Axiomatics WP Alt-Ergo (Native) Total Success -Lemma - 2 2 100% -------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.res.oracle similarity index 100% rename from src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.0.res.oracle rename to src/plugins/wp/tests/wp_plugin/oracle_qualif/convert.res.oracle diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.1.res.oracle index 8419319f579d41c559a2b1a06ca94882a297dbeb..09997a7fac3dfc41bd52eb294988b1d2bdc12825 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.1.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.1.res.oracle @@ -1,19 +1,17 @@ # frama-c -wp [...] [kernel] Parsing flash.c (with preprocessing) [wp] Running WP plugin... -[wp] flash-ergo.driver:2: Warning: Redefinition of logic INDEX_init [wp] Warning: Missing RTE guards [wp] 6 goals scheduled -[wp] [Qed] Goal typed_flash_flash-ergo_job_ensures_Events : Valid -[wp] [Alt-Ergo] Goal typed_flash_flash-ergo_job_ensures_A_reads : Valid -[wp] [Alt-Ergo] Goal typed_flash_flash-ergo_job_ensures_B_reads : Valid -[wp] [Alt-Ergo] Goal typed_flash_flash-ergo_job_ensures_B_writes : Valid -[wp] [Alt-Ergo] Goal typed_flash_flash-ergo_job_ensures_ReadValues : Valid -[wp] [Alt-Ergo] Goal typed_flash_flash-ergo_job_ensures_WriteValues : Valid +[wp] [Qed] Goal typed_flash_job_ensures_Events : Valid +[wp] [Qed] Goal typed_flash_job_ensures_A_reads : Valid +[wp] [Qed] Goal typed_flash_job_ensures_B_reads : Valid +[wp] [Qed] Goal typed_flash_job_ensures_B_writes : Valid +[wp] [Qed] Goal typed_flash_job_ensures_ReadValues : Valid +[wp] [Qed] Goal typed_flash_job_ensures_WriteValues : Valid [wp] Proved goals: 6 / 6 - Qed: 1 - Alt-Ergo: 5 + Qed: 6 ------------------------------------------------------------ Functions WP Alt-Ergo Total Success - job 1 5 6 100% + job 6 - 6 100% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.2.res.oracle deleted file mode 100644 index 09997a7fac3dfc41bd52eb294988b1d2bdc12825..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/flash.2.res.oracle +++ /dev/null @@ -1,17 +0,0 @@ -# frama-c -wp [...] -[kernel] Parsing flash.c (with preprocessing) -[wp] Running WP plugin... -[wp] Warning: Missing RTE guards -[wp] 6 goals scheduled -[wp] [Qed] Goal typed_flash_job_ensures_Events : Valid -[wp] [Qed] Goal typed_flash_job_ensures_A_reads : Valid -[wp] [Qed] Goal typed_flash_job_ensures_B_reads : Valid -[wp] [Qed] Goal typed_flash_job_ensures_B_writes : Valid -[wp] [Qed] Goal typed_flash_job_ensures_ReadValues : Valid -[wp] [Qed] Goal typed_flash_job_ensures_WriteValues : Valid -[wp] Proved goals: 6 / 6 - Qed: 6 ------------------------------------------------------------- - Functions WP Alt-Ergo Total Success - job 6 - 6 100% ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.0.res.oracle deleted file mode 100644 index 035a7253a8796855be87d1e57b2c7182febefb46..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.0.res.oracle +++ /dev/null @@ -1,17 +0,0 @@ -# frama-c -wp [...] -[kernel] Parsing float_format.i (no preprocessing) -[kernel:parser:decimal-float] float_format.i:10: Warning: - Floating-point constant 0.2 is not represented exactly. Will use 0x1.999999999999ap-3. - (warn-once: no further messages from category 'parser:decimal-float' will be emitted) -[wp] Running WP plugin... -[wp] Warning: Missing RTE guards -[wp] Warning: native support for coq is deprecated, use tip instead -[wp] 1 goal scheduled -[wp] [Coq] Goal typed_output_ensures_KO : Default tactic -[wp] [Coq (native)] Goal typed_output_ensures_KO : Unsuccess -[wp] Proved goals: 0 / 1 - Coq (native): 0 (unsuccess: 1) ------------------------------------------------------------- - Functions WP Alt-Ergo Total Success - output - - 1 0.0% ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.1.res.oracle deleted file mode 100644 index 0b38dce72acbbe0166038cebb9c17e7bb744cfdb..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.1.res.oracle +++ /dev/null @@ -1,16 +0,0 @@ -# frama-c -wp -wp-timeout 100 -wp-steps 5 [...] -[kernel] Parsing float_format.i (no preprocessing) -[kernel:parser:decimal-float] float_format.i:10: Warning: - Floating-point constant 0.2 is not represented exactly. Will use 0x1.999999999999ap-3. - (warn-once: no further messages from category 'parser:decimal-float' will be emitted) -[wp] Running WP plugin... -[wp] Warning: Missing RTE guards -[wp] Warning: native support for alt-ergo is deprecated, use why3 instead -[wp] 1 goal scheduled -[wp] [Alt-Ergo (native)] Goal typed_output_ensures_KO : Unsuccess -[wp] Proved goals: 0 / 1 - Alt-Ergo (native): 0 (unsuccess: 1) ------------------------------------------------------------- - Functions WP Alt-Ergo Total Success - output - - 1 0.0% ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.res.oracle similarity index 92% rename from src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.2.res.oracle rename to src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.res.oracle index 876b56b73ef0f3a6041262e3113ca6d40502a1f5..cb9d081888bd4d94a305be62ff79c2f550a58ce1 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.2.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/float_format.res.oracle @@ -1,6 +1,6 @@ # frama-c -wp -wp-timeout 100 -wp-steps 5 [...] [kernel] Parsing float_format.i (no preprocessing) -[kernel:parser:decimal-float] float_format.i:10: Warning: +[kernel:parser:decimal-float] float_format.i:8: Warning: Floating-point constant 0.2 is not represented exactly. Will use 0x1.999999999999ap-3. (warn-once: no further messages from category 'parser:decimal-float' will be emitted) [wp] Running WP plugin... diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/inductive.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/inductive.res.oracle deleted file mode 100644 index 6ba6b85a7b863238c853add006c0bbf2c5705c78..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/inductive.res.oracle +++ /dev/null @@ -1,16 +0,0 @@ -# frama-c -wp -wp-timeout 240 [...] -[kernel] Parsing inductive.c (with preprocessing) -[wp] Running WP plugin... -[wp] Warning: native support for coq is deprecated, use tip instead -[wp] 2 goals scheduled -[wp] [Coq] Goal typed_lemma_offset : Saved script -[wp] [Coq (native)] Goal typed_lemma_offset : Valid -[wp] [Coq] Goal typed_lemma_test : Saved script -[wp] [Coq (native)] Goal typed_lemma_test : Valid -[wp] Proved goals: 2 / 2 - Qed: 0 - Coq (native): 2 ------------------------------------------------------------- - Axiomatics WP Alt-Ergo Total Success - Lemma - - 2 100% ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.1.res.oracle index 773a5245836281bda1c4734cac463b776176e985..69ac94a86894ed67b60991613cedc80023e2b4ad 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.1.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.1.res.oracle @@ -1,53 +1,20 @@ -# frama-c -wp -wp-timeout 100 -wp-steps 1500 [...] +# frama-c -wp -wp-timeout 100 -wp-steps 10 [...] [kernel] Parsing math.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards -[wp] Warning: native support for alt-ergo is deprecated, use why3 instead -[wp] 30 goals scheduled -[wp] [Alt-Ergo (native)] Goal typed_lemma_abs_neg : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_abs_pos : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_atan_sin_cos : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_cosh_opp : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_distance : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_exp_log_add_mul : Valid -[wp] [Qed] Goal typed_lemma_exp_pos : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_log_exp_mul_add : Valid -[wp] [Qed] Goal typed_lemma_max_ac : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_max_inf : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_max_or : Valid -[wp] [Qed] Goal typed_lemma_min_ac : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_min_inf : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_min_or : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_pow_2 : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_sinh_opp : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_sqrt_mono : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_sqrt_pos : Valid -[wp] [Alt-Ergo (native)] Goal typed_lemma_tanh_opp : Valid -[wp] [Alt-Ergo (native)] Goal typed_ok_ensures_sin_asin : Valid -[wp] [Alt-Ergo (native)] Goal typed_ok_ensures_sin_asin_in_range : Valid -[wp] [Alt-Ergo (native)] Goal typed_ok_ensures_cos_acos : Valid -[wp] [Alt-Ergo (native)] Goal typed_ok_ensures_cos_acos_in_range : Valid -[wp] [Qed] Goal typed_ok_ensures_tan_atan : Valid -[wp] [Alt-Ergo (native)] Goal typed_ok_ensures_log_pow : Valid -[wp] [Qed] Goal typed_ok_ensures_log_exp : Valid -[wp] [Alt-Ergo (native)] Goal typed_ok_ensures_exp_log : Valid -[wp] [Alt-Ergo (native)] Goal typed_ok_ensures_min_plus_distrib : Valid -[wp] [Alt-Ergo (native)] Goal typed_ok_ensures_sqrt_pos : Valid -[wp] [Alt-Ergo (native)] Goal typed_ok_ensures_sqrt_pos0 : Valid -[wp] Proved goals: 30 / 30 - Qed: 5 - Alt-Ergo (native): 25 ------------------------------------------------------------- - Axiomatics WP Alt-Ergo Total Success - Lemma 3 - 19 100% +[wp] 9 goals scheduled +[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_sin_asin : Unsuccess +[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_cos_acos : Unsuccess +[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_asin_sin : Unsuccess +[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_acos_cos : Unsuccess +[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_atan_tan : Unsuccess +[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_log_pow : Unsuccess +[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_exp_log : Unsuccess +[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_exp_log_add_mul : Unsuccess +[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_sqrt_pos : Unsuccess +[wp] Proved goals: 0 / 9 + Alt-Ergo: 0 (unsuccess: 9) ------------------------------------------------------------ Functions WP Alt-Ergo Total Success - ok 2 - 11 100% + ko - - 9 0.0% ------------------------------------------------------------ -------------------------------------------------------------- -Axiomatics WP Alt-Ergo (Native) Total Success -Lemma 3 16 19 100% -------------------------------------------------------------- -Functions WP Alt-Ergo (Native) Total Success -ok 2 9 11 100% -------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.2.res.oracle deleted file mode 100644 index 69ac94a86894ed67b60991613cedc80023e2b4ad..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.2.res.oracle +++ /dev/null @@ -1,20 +0,0 @@ -# frama-c -wp -wp-timeout 100 -wp-steps 10 [...] -[kernel] Parsing math.i (no preprocessing) -[wp] Running WP plugin... -[wp] Warning: Missing RTE guards -[wp] 9 goals scheduled -[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_sin_asin : Unsuccess -[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_cos_acos : Unsuccess -[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_asin_sin : Unsuccess -[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_acos_cos : Unsuccess -[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_atan_tan : Unsuccess -[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_log_pow : Unsuccess -[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_exp_log : Unsuccess -[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_exp_log_add_mul : Unsuccess -[wp] [Alt-Ergo] Goal typed_ko_ensures_ko_sqrt_pos : Unsuccess -[wp] Proved goals: 0 / 9 - Alt-Ergo: 0 (unsuccess: 9) ------------------------------------------------------------- - Functions WP Alt-Ergo Total Success - ko - - 9 0.0% ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.3.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.3.res.oracle deleted file mode 100644 index d0872807ed58e412921ecbda4ffd377fb27c85eb..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/math.3.res.oracle +++ /dev/null @@ -1,25 +0,0 @@ -# frama-c -wp -wp-timeout 100 -wp-steps 10 [...] -[kernel] Parsing math.i (no preprocessing) -[wp] Running WP plugin... -[wp] Warning: Missing RTE guards -[wp] Warning: native support for alt-ergo is deprecated, use why3 instead -[wp] 9 goals scheduled -[wp] [Alt-Ergo (native)] Goal typed_ko_ensures_ko_sin_asin : Unsuccess -[wp] [Alt-Ergo (native)] Goal typed_ko_ensures_ko_cos_acos : Unsuccess -[wp] [Alt-Ergo (native)] Goal typed_ko_ensures_ko_asin_sin : Unsuccess -[wp] [Alt-Ergo (native)] Goal typed_ko_ensures_ko_acos_cos : Unsuccess -[wp] [Alt-Ergo (native)] Goal typed_ko_ensures_ko_atan_tan : Unsuccess -[wp] [Alt-Ergo (native)] Goal typed_ko_ensures_ko_log_pow : Unsuccess -[wp] [Alt-Ergo (native)] Goal typed_ko_ensures_ko_exp_log : Unsuccess -[wp] [Alt-Ergo (native)] Goal typed_ko_ensures_ko_exp_log_add_mul : Unsuccess -[wp] [Alt-Ergo (native)] Goal typed_ko_ensures_ko_sqrt_pos : Unsuccess -[wp] Proved goals: 0 / 9 - Alt-Ergo (native): 0 (unsuccess: 9) ------------------------------------------------------------- - Functions WP Alt-Ergo Total Success - ko - - 9 0.0% ------------------------------------------------------------- -------------------------------------------------------------- -Functions WP Alt-Ergo (Native) Total Success -ko - - 9 0.0% -------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/nth.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/nth.res.oracle index 68fe97d6e4fa3fa66f330d8a0def5a8eab97d2f6..855f0b498abb2e9353cf11f60972dc95e9a15fc1 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/nth.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/nth.res.oracle @@ -1,15 +1,39 @@ # frama-c -wp [...] [kernel] Parsing nth.i (no preprocessing) [wp] Running WP plugin... -[wp] 4 goals scheduled +[wp] 26 goals scheduled [wp] [Alt-Ergo] Goal typed_lemma_access_16_16_ok : Valid [wp] [Alt-Ergo] Goal typed_lemma_access_4_4_ok : Valid -[wp] [Alt-Ergo] Goal typed_lemma_access_repeat_concat_3_ok_lack : Unsuccess +[wp] [Alt-Ergo] Goal typed_lemma_access_repeat_concat_3_ok_lack : Valid +[wp] [Qed] Goal typed_check_lemma_constructor_elt_ok : Valid [wp] [Qed] Goal typed_lemma_eq_repeat_concat_3_ok : Valid -[wp] Proved goals: 3 / 4 - Qed: 1 - Alt-Ergo: 2 (unsuccess: 1) +[wp] [Qed] Goal typed_check_lemma_left_shift_repeat1_ok : Valid +[wp] [Qed] Goal typed_check_lemma_left_shift_repeat2_ok : Valid +[wp] [Qed] Goal typed_check_lemma_left_unfold_repeat1_ok : Valid +[wp] [Qed] Goal typed_check_lemma_left_unfold_repeat2_ok : Valid +[wp] [Qed] Goal typed_check_lemma_negative_repeat_ok : Valid +[wp] [Qed] Goal typed_check_lemma_not_nil_elt_ok : Valid +[wp] [Qed] Goal typed_check_lemma_nth_repeat_1_ok : Valid +[wp] [Qed] Goal typed_check_lemma_nth_repeat_2_ok : Valid +[wp] [Qed] Goal typed_check_lemma_nth_repeat_3_ok : Valid +[wp] [Qed] Goal typed_check_lemma_nth_repeat_4_ok : Valid +[wp] [Alt-Ergo] Goal typed_check_lemma_nth_repeat_undefined_1_ko : Unsuccess +[wp] [Qed] Goal typed_check_lemma_repeat1_ok : Valid +[wp] [Qed] Goal typed_check_lemma_repeat2_ok : Valid +[wp] [Qed] Goal typed_check_lemma_repeat_nil_ok : Valid +[wp] [Qed] Goal typed_check_lemma_repeat_one_ok : Valid +[wp] [Qed] Goal typed_check_lemma_repeat_repeated_ok : Valid +[wp] [Qed] Goal typed_check_lemma_right_shift_repeat1_ok : Valid +[wp] [Qed] Goal typed_check_lemma_right_shift_repeat2_ok : Valid +[wp] [Qed] Goal typed_check_lemma_right_unfold_repeat1_ok : Valid +[wp] [Qed] Goal typed_check_lemma_right_unfold_repeat2_ok : Valid +[wp] [Qed] Goal typed_check_lemma_subsequence1_ok : Valid +[wp] Proved goals: 25 / 26 + Qed: 22 + Alt-Ergo: 3 (unsuccess: 1) ------------------------------------------------------------ Axiomatics WP Alt-Ergo Total Success - Axiomatic Nth 1 2 4 75.0% + Axiomatic Equality 13 - 13 100% + Axiomatic MkRepeat 4 - 4 100% + Axiomatic Nth 5 3 9 88.9% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/region_to_coq.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/region_to_coq.res.oracle deleted file mode 100644 index 724f423702b11d463ff5957c6ae6f936e1558ca3..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/region_to_coq.res.oracle +++ /dev/null @@ -1,20 +0,0 @@ -# frama-c -wp [...] -[kernel] Parsing region_to_coq.i (no preprocessing) -[wp] Running WP plugin... -[wp] Warning: Missing RTE guards -[wp] Warning: native support for coq is deprecated, use tip instead -[wp] 4 goals scheduled -[wp] [Coq] Goal typed_copy_loop_invariant_preserved : Saved script -[wp] [Coq (native)] Goal typed_copy_loop_invariant_preserved : Valid -[wp] [Coq] Goal typed_copy_loop_invariant_established : Saved script -[wp] [Coq (native)] Goal typed_copy_loop_invariant_established : Valid -[wp] [Qed] Goal typed_copy_loop_assigns_part1 : Valid -[wp] [Coq] Goal typed_copy_loop_assigns_part2 : Saved script -[wp] [Coq (native)] Goal typed_copy_loop_assigns_part2 : Valid -[wp] Proved goals: 4 / 4 - Qed: 1 - Coq (native): 3 ------------------------------------------------------------- - Functions WP Alt-Ergo Total Success - copy 1 - 4 100% ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/removed.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/removed.res.oracle index cfe964c22f0c10bf6df04acc470833ac945acf01..fea81fbc446980d841e953de902402a43b4f56b3 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/removed.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/removed.res.oracle @@ -11,7 +11,6 @@ [eva:final-states] Values at end of function main: __retres ∈ [-2147483647..2147483647] [wp] Running WP plugin... -[wp] Warning: Missing RTE guards [wp] 1 goal scheduled [wp] [Alt-Ergo] Goal typed_main_assert_Eva_signed_overflow : Unsuccess [wp] Proved goals: 0 / 1 @@ -21,5 +20,6 @@ main - - 1 0.0% ------------------------------------------------------------ [wp] Running WP plugin... +[wp] Warning: Missing RTE guards [wp] Warning: No goal generated ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/rte.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/rte.res.oracle index 4378c5286a802774782011e5efcf035646661793..f002fd6fea324372319cd2b9c60bae3af26c3fdc 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/rte.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/rte.res.oracle @@ -1,9 +1,9 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing rte.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function job -[rte] annotating function job2 -[rte] annotating function job3 +[rte:annot] annotating function job +[rte:annot] annotating function job2 +[rte:annot] annotating function job3 [wp] 6 goals scheduled [wp] [Alt-Ergo] Goal typed_job_assert_rte_mem_access : Unsuccess [wp] [Alt-Ergo] Goal typed_job_assert_rte_mem_access_2 : Unsuccess diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.0.res.oracle index 08751dc1962e76436108d5c150fb46acbffc110b..7602867d0780d45feb0ba2978880f36079220b2c 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.0.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.0.res.oracle @@ -38,16 +38,16 @@ [wp] [Qed] Goal typed_caveat_loops_assigns_normal_part1 : Valid [wp] [Qed] Goal typed_caveat_loops_assigns_normal_part2 : Valid [wp] [Qed] Goal typed_caveat_loops_assigns_normal_part3 : Valid -[wp] [Alt-Ergo] Goal typed_caveat_loops_g_called_ensures_ok_u1 : Valid +[wp] [Qed] Goal typed_caveat_loops_g_called_ensures_ok_u1 : Valid [wp] [Qed] Goal typed_caveat_loops_g_called_ensures_ok_u2 : Valid [wp] [Alt-Ergo] Goal typed_caveat_loops_g_not_called_ensures_ok_v1 : Valid [wp] [Alt-Ergo] Goal typed_caveat_loops_g_not_called_ensures_ok_v2 : Valid [wp] Proved goals: 39 / 39 - Qed: 25 - Alt-Ergo: 14 + Qed: 26 + Alt-Ergo: 13 ------------------------------------------------------------ Functions WP Alt-Ergo Total Success no_calls 5 5 10 100% sequence 8 2 10 100% - loops 12 7 19 100% + loops 13 6 19 100% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.1.res.oracle index d2806020044b634a1c493759069ee6fe5ebee4ee..fb728b9fa94a45d92d1f3cf5d409d84160adeadd 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.1.res.oracle +++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/sequence.1.res.oracle @@ -33,16 +33,16 @@ [wp] [Qed] Goal typed_caveat_loops_assigns_normal_part1 : Valid [wp] [Qed] Goal typed_caveat_loops_assigns_normal_part2 : Valid [wp] [Qed] Goal typed_caveat_loops_assigns_normal_part3 : Valid -[wp] [Alt-Ergo] Goal typed_caveat_loops_g_called_ensures_ok_u1 : Valid +[wp] [Qed] Goal typed_caveat_loops_g_called_ensures_ok_u1 : Valid [wp] [Qed] Goal typed_caveat_loops_g_called_ensures_ok_u2 : Valid [wp] [Alt-Ergo] Goal typed_caveat_loops_g_not_called_ensures_ok_v1 : Valid [wp] [Alt-Ergo] Goal typed_caveat_loops_g_not_called_ensures_ok_v2 : Valid [wp] Proved goals: 34 / 34 - Qed: 22 - Alt-Ergo: 12 + Qed: 23 + Alt-Ergo: 11 ------------------------------------------------------------ Functions WP Alt-Ergo Total Success no_calls 2 3 5 100% sequence 8 2 10 100% - loops 12 7 19 100% + loops 13 6 19 100% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/unsigned.0.session/script/lemma_U32.json b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unsigned.0.session/script/lemma_U32.json index 77438629a177d10c967e936ebf34b1db7e8cbf09..c4a3730943a5705f49d9a0510a3f8b28c275b328 100644 --- a/src/plugins/wp/tests/wp_plugin/oracle_qualif/unsigned.0.session/script/lemma_U32.json +++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unsigned.0.session/script/lemma_U32.json @@ -1,32 +1,11 @@ -[ { "header": "Bitwise Eq.", "tactic": "Wp.bitwised", +[ { "prover": "Alt-Ergo:2.2.0", "verdict": "timeout", "time": 10. }, + { "prover": "script", "verdict": "valid" }, + { "header": "Bitwise Eq.", "tactic": "Wp.bitwised", "params": { "Wp.bitwised.range": 32 }, - "select": { "select": "inside-goal", "occur": 0, + "select": { "select": "clause-goal", "target": "(land 4294967295 x_0)=x_0", "pattern": "=land$x4294967295$x" }, - "children": { "range": [ { "header": "Split", "tactic": "Wp.split", - "params": {}, - "select": { "select": "clause-goal", - "target": "(0<=x_0) /\\ (0<=(land 4294967295 x_0)) /\\ (x_0<=4294967295)", - "pattern": "&<=<=<=0$x0land$x42949672954294967295" }, - "children": { "Goal 1/3": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", - "time": 0.0095, - "steps": 14 } ], - "Goal 2/3": [ { "header": "Bit Range", - "tactic": "Wp.bitrange", - "params": - { "positive-land": true, - "positive-lor": true }, - "select": - { "select": "clause-goal", - "target": "0<=(land 4294967295 x_0)", - "pattern": "<=0land4294967295$x" }, - "children": - { "bit-range": - [ { "prover": "qed", - "verdict": "valid" } ] } } ], - "Goal 3/3": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", - "time": 0.01, - "steps": 14 } ] } } ], + "children": { "range": [ { "prover": "Alt-Ergo:2.2.0", + "verdict": "valid", "time": 0.0054, + "steps": 15 } ], "bitwise": [ { "prover": "qed", "verdict": "valid" } ] } } ] diff --git a/src/plugins/wp/tests/wp_plugin/region_to_coq.i b/src/plugins/wp/tests/wp_plugin/region_to_coq.i deleted file mode 100644 index 24ca4a86019fb5939ae553d2d1b18396e78c6a47..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/region_to_coq.i +++ /dev/null @@ -1,14 +0,0 @@ -/* run.config - DONTRUN: -*/ -/* run.config_qualif - OPT: -wp-prover native:coq -wp-coq-script %{dep:@PTEST_DIR@/region_to_coq.script} -*/ - -void copy(int* a, unsigned int n, int* b) -{ - /*@ loop invariant 0 <= i <= n ; - loop assigns i, b[0..n-1]; */ - for(unsigned int i = 0; i < n; ++i) - b[i] = a[i]; -} diff --git a/src/plugins/wp/tests/wp_plugin/region_to_coq.script b/src/plugins/wp/tests/wp_plugin/region_to_coq.script deleted file mode 100644 index ec805f70b549129917db4df73cf1b8a5a297c2f2..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_plugin/region_to_coq.script +++ /dev/null @@ -1,36 +0,0 @@ -(* Generated by Frama-C WP *) - -Goal typed_copy_loop_assigns_part2. -Hint *,b,copy,i,loop-assigns,part-1. -Proof. - intros. - unfold included, shift_sint32. - unfold base, offset, shift ; simpl. - omega. -Qed. - -Goal typed_copy_loop_invariant_established. -Hint copy,established. -Proof. - unfold is_uint32 ; intros ; omega. -Qed. - -Goal typed_copy_loop_invariant_preserved. -Hint copy,preserved. -Proof. - intros i n Li Ui Ln _ Hi Hn. - Require Import Lia. - assert (Hi_1: (1+i <= n)%Z) by lia. - unfold is_uint32, to_uint32. - unfold to_range. - rewrite Z.add_0_l. - repeat rewrite Z.sub_0_r. - unfold is_uint32 in Hi. - assert (Bs: (1 + i = 4294967296)%Z \/ (1 + i < 4294967296)%Z) by lia. - inversion_clear Bs as [ Eq | Lower ]. - - rewrite <- Eq. - rewrite Z_mod_same ; lia. - - rewrite Z.mod_small ; lia. -Qed. - - diff --git a/src/plugins/wp/tests/wp_store/oracle/struct.res.oracle b/src/plugins/wp/tests/wp_store/oracle/struct.res.oracle index d2f2f233aafc0dc24fff1c207211196eefd4a84c..fbd7dd33f4182ae76bd0674381b43b41ee30c402 100644 --- a/src/plugins/wp/tests/wp_store/oracle/struct.res.oracle +++ b/src/plugins/wp/tests/wp_store/oracle/struct.res.oracle @@ -49,13 +49,13 @@ Assume { (* Heap *) Type: region(G_v_30) <= 0. (* Initializer *) - Init: (w.F2_St_a) = 1. - (* Initializer *) - Init: (w.F2_St_b) = 2. - (* Initializer *) Init: Mint_0[shiftfield_F2_St_a(a)] = 1. (* Initializer *) Init: Mint_0[shiftfield_F2_St_b(a)] = 2. + (* Initializer *) + Init: (w.F2_St_a) = 1. + (* Initializer *) + Init: (w.F2_St_b) = 2. } Prove: EqS2_St(a_1, w). @@ -69,13 +69,13 @@ Assume { (* Heap *) Type: region(G_v_30) <= 0. (* Initializer *) - Init: (w.F2_St_a) = 1. - (* Initializer *) - Init: (w.F2_St_b) = 2. - (* Initializer *) Init: Mint_0[shiftfield_F2_St_a(a)] = 1. (* Initializer *) Init: Mint_0[shiftfield_F2_St_b(a)] = 2. + (* Initializer *) + Init: (w.F2_St_a) = 1. + (* Initializer *) + Init: (w.F2_St_b) = 2. } Prove: EqS2_St(a_1, w). diff --git a/src/plugins/wp/tests/wp_tip/TacNOP.ml b/src/plugins/wp/tests/wp_tip/TacNOP.ml index 7b2413cd0a66588084c5df65be5ec6f34b468e9d..a398efe3ac597d6d3b7dec5ff98f1d206c299f59 100644 --- a/src/plugins/wp/tests/wp_tip/TacNOP.ml +++ b/src/plugins/wp/tests/wp_tip/TacNOP.ml @@ -16,6 +16,7 @@ class nop = match s with | Empty -> Not_applicable | Compose _ + | Multi _ | Inside _ | Clause _ -> feedback#set_title "NOP" ; diff --git a/src/plugins/wp/tests/wp_tip/clear.i b/src/plugins/wp/tests/wp_tip/clear.i index 6abddf24da825c3c378e921cb3f540f9b7b18a78..38bb4997fe998982b6335db4dcbcc26d541cd45e 100644 --- a/src/plugins/wp/tests/wp_tip/clear.i +++ b/src/plugins/wp/tests/wp_tip/clear.i @@ -1,5 +1,5 @@ /* run.config - OPT: -wp-par 1 -wp-no-print -wp-prover qed,tip -wp-msg-key script -wp-session @PTEST_DIR@/oracle/@PTEST_NAME@.session + OPT: -wp-par 1 -wp-no-print -wp-prover qed,tip -wp-msg-key script -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.session */ /* run.config_qualif DONTRUN: @@ -26,3 +26,8 @@ void clear(void) { b--; } } + +void clear_in_step(void){ + //@ admit P && Q && R ; + //@ check S(42) ; +} diff --git a/src/plugins/wp/tests/wp_tip/induction_typing.i b/src/plugins/wp/tests/wp_tip/induction_typing.i new file mode 100644 index 0000000000000000000000000000000000000000..c7e34e57aad8acb2248ac0403f85191c29299325 --- /dev/null +++ b/src/plugins/wp/tests/wp_tip/induction_typing.i @@ -0,0 +1,50 @@ +/* run.config + OPT: -wp-par 1 -wp-prop X -wp-no-print -wp-prover qed,tip -wp-msg-key script -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.session +*/ +/* run.config_qualif + DONTRUN: +*/ + +/* This test is meant to check that we do not generate a ill-formed VC with the + induction tactic. Here, the bug happened when triggering an induction on i + (i was replaced with true) when proving that X is preserved . The example is + complex because we need to have some State variable for i. */ + +extern int LIST; +extern unsigned int cpt; +extern unsigned int A[]; + +/*@ + axiomatic call { + logic \list<integer> list{L2} reads LIST; + } +*/ + +/*@ + ensures cpt == \old(cpt) + 1; + ensures A[\old(cpt)] == \old(i); + ensures list == (\old(list) ^ [| 1 |]); + assigns cpt, LIST; +*/ +void f(unsigned int i); + + +/*@ + requires list == [| |]; + requires cpt == 0; +*/ +void function(unsigned int Max) +{ + unsigned int i = 0; + /*@ + loop invariant 0 <= cpt == i <= 42; + loop invariant X: list == (\at(list,LoopEntry) ^ ([| 1 |] *^ i)); + loop assigns i, cpt, LIST; + */ + while (i < Max) { + f(i); + i ++; + } + + return; +} diff --git a/src/plugins/wp/tests/wp_tip/modmask.i b/src/plugins/wp/tests/wp_tip/modmask.i new file mode 100644 index 0000000000000000000000000000000000000000..1970a5e62026c8ec79c5414ac01097565831704b --- /dev/null +++ b/src/plugins/wp/tests/wp_tip/modmask.i @@ -0,0 +1,18 @@ +/* run.config + OPT: -wp-par 1 -wp-no-print -wp-prover qed,tip -wp-msg-key script -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session + OPT: -wp-par 1 -wp-no-print -wp-prover qed,tip -wp-msg-key script -wp-session @PTEST_SUITE_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session +*/ +/* run.config_qualif + DONTRUN: +*/ + +/*@ + check lemma and_modulo_us_255: + \forall unsigned short us ; (us & 0xFF) == us % 0x100 ; +*/ + +/*@ + check lemma and_modulo_u: + \forall unsigned us, integer shift; + 0 <= shift < (sizeof(us) * 8) ==> (us & ((1 << shift) - 1)) == us % (1 << shift); +*/ diff --git a/src/plugins/wp/tests/wp_tip/oracle/chunk_printing.res.oracle b/src/plugins/wp/tests/wp_tip/oracle/chunk_printing.res.oracle index 824c33cc9629152b4a214b1138fe07c0649943d2..71cace973f704cebd22bcc5e0cdcfa3ae0655c65 100644 --- a/src/plugins/wp/tests/wp_tip/oracle/chunk_printing.res.oracle +++ b/src/plugins/wp/tests/wp_tip/oracle/chunk_printing.res.oracle @@ -1,7 +1,7 @@ # frama-c -wp -wp-rte [...] [kernel] Parsing chunk_printing.i (no preprocessing) [wp] Running WP plugin... -[rte] annotating function main +[rte:annot] annotating function main ------------------------------------------------------------ Function main ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_tip/oracle/clear.res.oracle b/src/plugins/wp/tests/wp_tip/oracle/clear.res.oracle index 72226ceb96e8ff55db312aa84e551ba12fb48bd8..85363bf27b51a638d6c2a5287d6a1f7a50e80470 100644 --- a/src/plugins/wp/tests/wp_tip/oracle/clear.res.oracle +++ b/src/plugins/wp/tests/wp_tip/oracle/clear.res.oracle @@ -2,7 +2,147 @@ [kernel] Parsing clear.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards -[wp] 1 goal scheduled -[wp] [Failed] Goal typed_clear_ensures -[wp] Proved goals: 0 / 1 +[wp] 2 goals scheduled +[wp:script:allgoals] + Goal Post-condition (file clear.i, line 21) in 'clear': + Assume { + Type: is_sint32(a) /\ is_sint32(a_1) /\ is_sint32(a_2) /\ is_sint32(b) /\ + is_sint32(b_1) /\ is_sint32(b_2). + (* Pre-condition *) + Have: P_P. + (* Pre-condition *) + Have: P_Q. + (* Pre-condition *) + Have: P_R. + If a_2 < b_2 + Then { Have: (a_2 = a_1) /\ (b_2 = b). Have: (1 + a_1) = a. } + Else { Have: (a_2 = a) /\ (b_2 = b_1). Have: (1 + b) = b_1. } + } + Prove: P_S(a + b). + + ------------------------------------------------------------ +[wp:script:allgoals] + Goal Check (file clear.i, line 32): + Assume { (* Admit *) Have: P_P /\ P_Q /\ P_R. } + Prove: P_S(42). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_clear_ensures subgoal: + + Goal Wp.Tactical.typed_clear_ensures-0 (generated): + Assume { + Type: is_sint32(a) /\ is_sint32(a_1) /\ is_sint32(a_2) /\ is_sint32(b) /\ + is_sint32(b_1) /\ is_sint32(b_2). + (* Pre-condition *) + Have: P_P. + (* Pre-condition *) + Have: P_Q. + (* Pre-condition *) + Have: P_R. + If a_2 < b_2 + Then { Have: (a_2 = a_1) /\ (b_2 = b). } + Else { Have: (a_2 = a) /\ (b_2 = b_1). Have: (1 + b) = b_1. } + } + Prove: P_S(a + b). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_clear_in_step_check subgoal: + + Goal Wp.Tactical.typed_clear_in_step_check-0 (generated): + Assume { (* Filtered *) Have: P_Q /\ P_R. } + Prove: P_S(42). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_clear_ensures subgoal: + + Goal Wp.Tactical.typed_clear_ensures-1 (generated): + Assume { + Type: is_sint32(a) /\ is_sint32(a_1) /\ is_sint32(a_2) /\ is_sint32(b) /\ + is_sint32(b_1) /\ is_sint32(b_2). + (* Pre-condition *) + Have: P_P. + (* Pre-condition *) + Have: P_Q. + If a_2 < b_2 + Then { Have: (a_2 = a_1) /\ (b_2 = b). } + Else { Have: (a_2 = a) /\ (b_2 = b_1). Have: (1 + b) = b_1. } + } + Prove: P_S(a + b). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_clear_in_step_check subgoal: + + Goal Wp.Tactical.typed_clear_in_step_check-1 (generated): + Assume { (* Filtered *) Have: P_R. } + Prove: P_S(42). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_clear_ensures subgoal: + + Goal Wp.Tactical.typed_clear_ensures-2 (generated): + Assume { + Type: is_sint32(a) /\ is_sint32(a_1) /\ is_sint32(a_2) /\ is_sint32(b) /\ + is_sint32(b_1). + (* Pre-condition *) + Have: P_P. + (* Pre-condition *) + Have: P_Q. + If a_2 < b_1 + Then { Have: (a_2 = a_1) /\ (b_1 = b). } + } + Prove: P_S(a + b). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_clear_in_step_check subgoal: + + Goal Wp.Tactical.typed_clear_in_step_check-2 (generated): + Prove: P_S(42). + + ------------------------------------------------------------ +[wp] [Script] Goal typed_clear_in_step_check : Unsuccess +[wp:script:allgoals] + typed_clear_ensures subgoal: + + Goal Wp.Tactical.typed_clear_ensures-3 (generated): + Assume { + Type: is_sint32(a) /\ is_sint32(b). + (* Pre-condition *) + Have: P_P. + (* Pre-condition *) + Have: P_Q. + } + Prove: P_S(a + b). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_clear_ensures subgoal: + + Goal Wp.Tactical.typed_clear_ensures-4 (generated): + Assume { Type: is_sint32(a) /\ is_sint32(b). (* Pre-condition *) Have: P_P. } + Prove: P_S(a + b). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_clear_ensures subgoal: + + Goal Wp.Tactical.typed_clear_ensures-5 (generated): + Assume { (* Pre-condition *) Have: P_P. } + Prove: P_S(a + b). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_clear_ensures subgoal: + + Goal Wp.Tactical.typed_clear_ensures-6 (generated): + Prove: P_S(a + b). + + ------------------------------------------------------------ +[wp] [Script] Goal typed_clear_ensures : Unsuccess +[wp] Proved goals: 0 / 2 [wp] No updated script. diff --git a/src/plugins/wp/tests/wp_tip/oracle/clear.session/script/clear_in_step_check.json b/src/plugins/wp/tests/wp_tip/oracle/clear.session/script/clear_in_step_check.json new file mode 100644 index 0000000000000000000000000000000000000000..231674bdd87b18979b9942eb2b9d72272ff0a590 --- /dev/null +++ b/src/plugins/wp/tests/wp_tip/oracle/clear.session/script/clear_in_step_check.json @@ -0,0 +1,20 @@ +[ { "header": "Clear", "tactic": "Wp.clear", "params": {}, + "select": { "select": "inside-step", "at": 2, "kind": "have", "occur": 0, + "target": "P_P", "pattern": "P_P" }, + "children": { "Filtered": [ { "header": "Clear", "tactic": "Wp.clear", + "params": {}, + "select": { "select": "inside-step", + "at": 2, "kind": "have", + "occur": 0, "target": "P_Q", + "pattern": "P_Q" }, + "children": { "Filtered": [ { "header": "Clear", + "tactic": "Wp.clear", + "params": {}, + "select": + { "select": "clause-step", + "at": 2, + "kind": "have", + "target": "P_R", + "pattern": "P_R" }, + "children": + { "Cleared hypothesis": [] } } ] } } ] } } ] diff --git a/src/plugins/wp/tests/wp_tip/oracle/induction_typing.res.oracle b/src/plugins/wp/tests/wp_tip/oracle/induction_typing.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..3029b122d792578ce355ad05c505dbb4ed763ad9 --- /dev/null +++ b/src/plugins/wp/tests/wp_tip/oracle/induction_typing.res.oracle @@ -0,0 +1,120 @@ +# frama-c -wp [...] +[kernel] Parsing induction_typing.i (no preprocessing) +[wp] Running WP plugin... +[wp] Warning: Missing RTE guards +[wp] 2 goals scheduled +[wp:script:allgoals] + Goal Preservation of Invariant 'X' (file induction_typing.i, line 41): + Let a = L_list(LIST_0). + Let a_1 = a ^ [ 1 ]. + Let x = 1 + i. + Assume { + Type: is_uint32(Max_0) /\ is_uint32(i). + (* Heap *) + Type: IsArray_uint32(A) /\ is_sint32(LIST_1). + (* Pre-condition *) + Have: L_list(LIST_1) = nil. + (* Invariant *) + Have: (x = to_uint32(x)) /\ (0 <= i) /\ (i <= 42). + (* Invariant 'X' *) + Have: ([ 1 ] *^ i) = a. + (* Then *) + Have: i < Max_0. + (* Call 'f' *) + Have: (A[i] = i) /\ (L_list(LIST_2) = a_1). + (* Invariant *) + Have: i <= 41. + } + Prove: ([ 1 ] *^ x) = a_1. + + ------------------------------------------------------------ +[wp] [Qed] Goal typed_function_loop_invariant_X_established : Valid +[wp:script:allgoals] + typed_function_loop_invariant_X_preserved subgoal: + + Goal Wp.Tactical.typed_function_loop_invariant_X_preserved-0 (generated): + Let a = L_list(LIST_1). + Assume { + Type: is_uint32(Max_0) /\ is_uint32(i). + (* Heap *) + Type: IsArray_uint32(A) /\ is_sint32(LIST_0). + (* Pre-condition *) + Have: L_list(LIST_0) = nil. + (* Invariant *) + Have: (0 <= i) /\ (i <= 42). + (* Invariant 'X' *) + Have: ([ 1 ] *^ i) = a. + (* Then *) + Have: i < Max_0. + (* Call 'f' *) + Have: (A[i] = i) /\ (L_list(LIST_2) = a ^ [ 1 ]). + (* Invariant *) + Have: i <= 41. + } + Prove: false. + + ------------------------------------------------------------ +[wp] [Script] Goal typed_function_loop_invariant_X_preserved : Unsuccess +[wp:script:allgoals] + typed_function_loop_invariant_X_preserved subgoal: + + Goal Wp.Tactical.typed_function_loop_invariant_X_preserved-1 (generated): + Let a = L_list(LIST_0). + Let a_1 = a ^ [ 1 ]. + Assume { + Have: to_uint32(n) = n. + Have: 0 < n. + Have: forall i_1 : Z. ((to_uint32(i_1) = i_1) -> ((0 <= i_1) -> + ((i_1 < n) -> (([ 1 ] *^ i_1) = a_1)))). + Type: is_uint32(Max_0) /\ is_uint32(i). + (* Heap *) + Type: IsArray_uint32(A) /\ is_sint32(LIST_1). + (* Pre-condition *) + Have: L_list(LIST_1) = nil. + (* Invariant *) + Have: (0 <= i) /\ (i <= 42). + (* Invariant 'X' *) + Have: ([ 1 ] *^ i) = a. + (* Then *) + Have: i < Max_0. + (* Call 'f' *) + Have: (A[i] = i) /\ (L_list(LIST_2) = a_1). + (* Invariant *) + Have: i <= 41. + } + Prove: ([ 1 ] *^ n) = a_1. + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_function_loop_invariant_X_preserved subgoal: + + Goal Wp.Tactical.typed_function_loop_invariant_X_preserved-2 (generated): + Let a = L_list(LIST_0). + Let a_1 = a ^ [ 1 ]. + Assume { + Have: to_uint32(n) = n. + Have: n < 0. + Have: forall i_1 : Z. ((to_uint32(i_1) = i_1) -> ((i_1 <= 0) -> + ((n < i_1) -> (([ 1 ] *^ i_1) = a_1)))). + Type: is_uint32(Max_0) /\ is_uint32(i). + (* Heap *) + Type: IsArray_uint32(A) /\ is_sint32(LIST_1). + (* Pre-condition *) + Have: L_list(LIST_1) = nil. + (* Invariant *) + Have: (0 <= i) /\ (i <= 42). + (* Invariant 'X' *) + Have: ([ 1 ] *^ i) = a. + (* Then *) + Have: i < Max_0. + (* Call 'f' *) + Have: (A[i] = i) /\ (L_list(LIST_2) = a_1). + (* Invariant *) + Have: i <= 41. + } + Prove: ([ 1 ] *^ n) = a_1. + + ------------------------------------------------------------ +[wp] Proved goals: 1 / 2 + Qed: 1 +[wp] No updated script. diff --git a/src/plugins/wp/tests/wp_tip/oracle/induction_typing.session/script/function_loop_invariant_X_preserved.json b/src/plugins/wp/tests/wp_tip/oracle/induction_typing.session/script/function_loop_invariant_X_preserved.json new file mode 100644 index 0000000000000000000000000000000000000000..8fb424a0d6acff1bd9c3632e4eb0ff4458e3dba9 --- /dev/null +++ b/src/plugins/wp/tests/wp_tip/oracle/induction_typing.session/script/function_loop_invariant_X_preserved.json @@ -0,0 +1,5 @@ +[ { "header": "Induction", "tactic": "Wp.induction", + "params": { "base": { "select": "kint", "val": "0" } }, + "select": { "select": "inside-goal", "occur": 0, "target": "1+i_1", + "pattern": "+1$i" }, + "children": { "Base": [], "Induction (sup)": [], "Induction (inf)": [] } } ] diff --git a/src/plugins/wp/tests/wp_tip/oracle/modmask.0.res.oracle b/src/plugins/wp/tests/wp_tip/oracle/modmask.0.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..dd1cd3edf7d9ef503650337d4d5bca8a6a5e038f --- /dev/null +++ b/src/plugins/wp/tests/wp_tip/oracle/modmask.0.res.oracle @@ -0,0 +1,79 @@ +# frama-c -wp [...] +[kernel] Parsing modmask.i (no preprocessing) +[wp] Running WP plugin... +[wp] 2 goals scheduled +[wp:script:allgoals] + Lemma and_modulo_u: + Prove: let x_0 = (lsl 1 shift_0) in + (0<=shift_0) -> (shift_0<=31) -> (is_uint32 us_0) + -> ((us_0 mod x_0)=(land us_0 (x_0-1))) + + ------------------------------------------------------------ +[wp:script:allgoals] + Lemma and_modulo_us_255: + Prove: (is_uint16 us_0) -> ((us_0 mod 256)=(land 255 us_0)) + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_check_lemma_and_modulo_u subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_u-0 (generated): + Let x = lsl(1, shift_0). + Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). } + Prove: (0 <= us_0) /\ (0 < x) /\ (exists i : Z. (lsl(1, i) = x) /\ (0 <= i)). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_check_lemma_and_modulo_u subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_u-1 (generated): + Prove: true. + Prover Qed returns Valid + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_check_lemma_and_modulo_us_255 subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_us_255-0 (generated): + Assume { Have: is_uint16(us_0). } + Prove: 0 <= us_0. + + ------------------------------------------------------------ +[wp] [Script] Goal typed_check_lemma_and_modulo_us_255 : Valid +[wp:script:allgoals] + typed_check_lemma_and_modulo_us_255 subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_us_255-1 (generated): + Prove: true. + Prover Qed returns Valid + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_check_lemma_and_modulo_u subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_u-2 (generated): + Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). } + Prove: 0 <= us_0. + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_check_lemma_and_modulo_u subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_u-3 (generated): + Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). } + Prove: 0 < lsl(1, shift_0). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_check_lemma_and_modulo_u subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_u-4 (generated): + Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). } + Prove: exists i : Z. (lsl(1, i) = lsl(1, shift_0)) /\ (0 <= i). + + ------------------------------------------------------------ +[wp] [Script] Goal typed_check_lemma_and_modulo_u : Valid +[wp] Proved goals: 2 / 2 + Qed: 0 + Script: 2 +[wp] Updated session with 2 new valid scripts. diff --git a/src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_u.json b/src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_u.json new file mode 100644 index 0000000000000000000000000000000000000000..e40e8863e3cf66cd9c1c3c6e4d1f0fa5d083d726 --- /dev/null +++ b/src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_u.json @@ -0,0 +1,162 @@ +[ { "header": "Mod-Mask", "tactic": "Wp.modmask", + "params": { "Wp.modmask.revert": false }, + "select": { "select": "inside-goal", "occur": 0, + "target": "us_0 mod (lsl 1 shift_0)", + "pattern": "%$uslsl1$shift" }, + "children": { "Mask Guard": [ { "header": "Split", "tactic": "Wp.split", + "params": {}, + "select": { "select": "clause-goal", + "target": "let x_0 = (lsl 1 shift_0) in\n(0<=us_0) /\\ (0<x_0) /\\ (exists i_0:int.\n ((lsl 1 i_0)=x_0) /\\ (0<=i_0))", + "pattern": "&<=<\\E0$us0lsl1$shiftlsl011$shift" }, + "children": { "Goal 1/3": [ { "header": "Definition", + "tactic": "Wp.unfold", + "params": {}, + "select": + { "select": "clause-step", + "at": 2, + "kind": "have", + "target": "(is_uint32 us_0)", + "pattern": "is_uint32$us" }, + "children": + { "Unfold 'is_uint32'": + [ { "prover": "qed", + "verdict": "valid" } ] } } ], + "Goal 2/3": [ { "header": "Range", + "tactic": "Wp.range", + "params": + { "inf": 0, + "sup": 31 }, + "select": + { "select": "inside-goal", + "occur": 0, + "target": "shift_0", + "pattern": "$shift" }, + "children": + { "Lower 0": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 0": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 1": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 2": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 3": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 4": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 5": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 6": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 7": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 8": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 9": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 10": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 11": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 12": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 13": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 14": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 15": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 16": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 17": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 18": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 19": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 20": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 21": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 22": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 23": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 24": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 25": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 26": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 27": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 28": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 29": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 30": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 31": + [ { "prover": "qed", + "verdict": "valid" } ], + "Upper 31": + [ { "prover": "qed", + "verdict": "valid" } ] } } ], + "Goal 3/3": [ { "header": "Instance", + "tactic": "Wp.instance", + "params": + { "P1": + { "select": "inside-goal", + "occur": 0, + "target": "shift_0", + "pattern": "$shift" }, + "P2": null, + "P3": null, + "P4": null, + "P5": null, + "P6": null, + "P7": null, + "P8": null, + "P9": null, + "P10": null }, + "select": + { "select": "clause-goal", + "target": "exists i_0:int. ((lsl 1 i_0)=(lsl 1 shift_0)) /\\ (0<=i_0)", + "pattern": "\\Elsl011$shift" }, + "children": + { "Witness": + [ { "prover": "qed", + "verdict": "valid" } ] } } ] } } ], + "Mask": [ { "prover": "qed", "verdict": "valid" } ] } } ] diff --git a/src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_us_255.json b/src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_us_255.json new file mode 100644 index 0000000000000000000000000000000000000000..0232433c576b0cb20e7c6108b28bec094abaa799 --- /dev/null +++ b/src/plugins/wp/tests/wp_tip/oracle/modmask.0.session/script/check_lemma_and_modulo_us_255.json @@ -0,0 +1,14 @@ +[ { "header": "Mod-Mask", "tactic": "Wp.modmask", + "params": { "Wp.modmask.revert": false }, + "select": { "select": "inside-goal", "occur": 0, + "target": "us_0 mod 256", "pattern": "%$us256" }, + "children": { "Mask Guard": [ { "header": "Definition", + "tactic": "Wp.unfold", "params": {}, + "select": { "select": "clause-step", + "at": 0, "kind": "have", + "target": "(is_uint16 us_0)", + "pattern": "is_uint16$us" }, + "children": { "Unfold 'is_uint16'": + [ { "prover": "qed", + "verdict": "valid" } ] } } ], + "Mask": [ { "prover": "qed", "verdict": "valid" } ] } } ] diff --git a/src/plugins/wp/tests/wp_tip/oracle/modmask.1.res.oracle b/src/plugins/wp/tests/wp_tip/oracle/modmask.1.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..dd1cd3edf7d9ef503650337d4d5bca8a6a5e038f --- /dev/null +++ b/src/plugins/wp/tests/wp_tip/oracle/modmask.1.res.oracle @@ -0,0 +1,79 @@ +# frama-c -wp [...] +[kernel] Parsing modmask.i (no preprocessing) +[wp] Running WP plugin... +[wp] 2 goals scheduled +[wp:script:allgoals] + Lemma and_modulo_u: + Prove: let x_0 = (lsl 1 shift_0) in + (0<=shift_0) -> (shift_0<=31) -> (is_uint32 us_0) + -> ((us_0 mod x_0)=(land us_0 (x_0-1))) + + ------------------------------------------------------------ +[wp:script:allgoals] + Lemma and_modulo_us_255: + Prove: (is_uint16 us_0) -> ((us_0 mod 256)=(land 255 us_0)) + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_check_lemma_and_modulo_u subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_u-0 (generated): + Let x = lsl(1, shift_0). + Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). } + Prove: (0 <= us_0) /\ (0 < x) /\ (exists i : Z. (lsl(1, i) = x) /\ (0 <= i)). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_check_lemma_and_modulo_u subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_u-1 (generated): + Prove: true. + Prover Qed returns Valid + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_check_lemma_and_modulo_us_255 subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_us_255-0 (generated): + Assume { Have: is_uint16(us_0). } + Prove: 0 <= us_0. + + ------------------------------------------------------------ +[wp] [Script] Goal typed_check_lemma_and_modulo_us_255 : Valid +[wp:script:allgoals] + typed_check_lemma_and_modulo_us_255 subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_us_255-1 (generated): + Prove: true. + Prover Qed returns Valid + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_check_lemma_and_modulo_u subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_u-2 (generated): + Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). } + Prove: 0 <= us_0. + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_check_lemma_and_modulo_u subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_u-3 (generated): + Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). } + Prove: 0 < lsl(1, shift_0). + + ------------------------------------------------------------ +[wp:script:allgoals] + typed_check_lemma_and_modulo_u subgoal: + + Goal Wp.Tactical.typed_check_lemma_and_modulo_u-4 (generated): + Assume { Have: 0 <= shift_0. Have: shift_0 <= 31. Have: is_uint32(us_0). } + Prove: exists i : Z. (lsl(1, i) = lsl(1, shift_0)) /\ (0 <= i). + + ------------------------------------------------------------ +[wp] [Script] Goal typed_check_lemma_and_modulo_u : Valid +[wp] Proved goals: 2 / 2 + Qed: 0 + Script: 2 +[wp] Updated session with 2 new valid scripts. diff --git a/src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_u.json b/src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_u.json new file mode 100644 index 0000000000000000000000000000000000000000..7d2e4b041e8f70d94528bc04cf06fc7d49bbbb6e --- /dev/null +++ b/src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_u.json @@ -0,0 +1,162 @@ +[ { "header": "Mod-Mask", "tactic": "Wp.modmask", + "params": { "Wp.modmask.revert": false }, + "select": { "select": "inside-goal", "occur": 0, + "target": "(land us_0 ((lsl 1 shift_0)-1))", + "pattern": "land$us+-1lsl1$shift" }, + "children": { "Mod Guard": [ { "header": "Split", "tactic": "Wp.split", + "params": {}, + "select": { "select": "clause-goal", + "target": "let x_0 = (lsl 1 shift_0) in\n(0<=us_0) /\\ (0<x_0) /\\ (exists i_0:int.\n ((lsl 1 i_0)=x_0) /\\ (0<=i_0))", + "pattern": "&<=<\\E0$us0lsl1$shiftlsl011$shift" }, + "children": { "Goal 1/3": [ { "header": "Definition", + "tactic": "Wp.unfold", + "params": {}, + "select": + { "select": "clause-step", + "at": 2, + "kind": "have", + "target": "(is_uint32 us_0)", + "pattern": "is_uint32$us" }, + "children": + { "Unfold 'is_uint32'": + [ { "prover": "qed", + "verdict": "valid" } ] } } ], + "Goal 2/3": [ { "header": "Range", + "tactic": "Wp.range", + "params": + { "inf": 0, + "sup": 31 }, + "select": + { "select": "inside-goal", + "occur": 0, + "target": "shift_0", + "pattern": "$shift" }, + "children": + { "Lower 0": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 0": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 1": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 2": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 3": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 4": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 5": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 6": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 7": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 8": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 9": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 10": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 11": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 12": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 13": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 14": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 15": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 16": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 17": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 18": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 19": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 20": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 21": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 22": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 23": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 24": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 25": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 26": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 27": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 28": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 29": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 30": + [ { "prover": "qed", + "verdict": "valid" } ], + "Value 31": + [ { "prover": "qed", + "verdict": "valid" } ], + "Upper 31": + [ { "prover": "qed", + "verdict": "valid" } ] } } ], + "Goal 3/3": [ { "header": "Instance", + "tactic": "Wp.instance", + "params": + { "P1": + { "select": "inside-goal", + "occur": 0, + "target": "shift_0", + "pattern": "$shift" }, + "P2": null, + "P3": null, + "P4": null, + "P5": null, + "P6": null, + "P7": null, + "P8": null, + "P9": null, + "P10": null }, + "select": + { "select": "clause-goal", + "target": "exists i_0:int. ((lsl 1 i_0)=(lsl 1 shift_0)) /\\ (0<=i_0)", + "pattern": "\\Elsl011$shift" }, + "children": + { "Witness": + [ { "prover": "qed", + "verdict": "valid" } ] } } ] } } ], + "Mod": [ { "prover": "qed", "verdict": "valid" } ] } } ] diff --git a/src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_us_255.json b/src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_us_255.json new file mode 100644 index 0000000000000000000000000000000000000000..a56490bac7af0b6011890ef00ef38f25fa4cd251 --- /dev/null +++ b/src/plugins/wp/tests/wp_tip/oracle/modmask.1.session/script/check_lemma_and_modulo_us_255.json @@ -0,0 +1,14 @@ +[ { "header": "Mod-Mask", "tactic": "Wp.modmask", + "params": { "Wp.modmask.revert": false }, + "select": { "select": "inside-goal", "occur": 0, + "target": "(land 255 us_0)", "pattern": "land255$us" }, + "children": { "Mod Guard": [ { "header": "Definition", + "tactic": "Wp.unfold", "params": {}, + "select": { "select": "clause-step", + "at": 0, "kind": "have", + "target": "(is_uint16 us_0)", + "pattern": "is_uint16$us" }, + "children": { "Unfold 'is_uint16'": + [ { "prover": "qed", + "verdict": "valid" } ] } } ], + "Mod": [ { "prover": "qed", "verdict": "valid" } ] } } ] diff --git a/src/plugins/wp/tests/wp_typed/oracle/array_initialized.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/array_initialized.0.res.oracle index 3a4d728759d7fbac2e6fb0a7a334c2c8cb815ebb..b9835cc22a8412ac09aa3e0f44de86e136e914f9 100644 --- a/src/plugins/wp/tests/wp_typed/oracle/array_initialized.0.res.oracle +++ b/src/plugins/wp/tests/wp_typed/oracle/array_initialized.0.res.oracle @@ -30,108 +30,6 @@ Assume { (* Goal *) When: (0 <= i) /\ (i <= 499). (* Initializer *) - Init: h2_0[0] = 0. - (* Initializer *) - Init: h2_0[1] = 1. - (* Initializer *) - Init: h2_0[2] = 2. - (* Initializer *) - Init: h2_0[3] = 3. - (* Initializer *) - Init: h2_0[4] = 4. - (* Initializer *) - Init: h2_0[5] = 5. - (* Initializer *) - Init: h2_0[6] = 6. - (* Initializer *) - Init: h2_0[7] = 7. - (* Initializer *) - Init: h2_0[8] = 8. - (* Initializer *) - Init: h2_0[9] = 9. - (* Initializer *) - Init: h2_0[10] = 10. - (* Initializer *) - Init: h2_0[11] = 11. - (* Initializer *) - Init: h2_0[12] = 12. - (* Initializer *) - Init: h2_0[13] = 13. - (* Initializer *) - Init: h2_0[14] = 14. - (* Initializer *) - Init: h2_0[15] = 15. - (* Initializer *) - Init: h2_0[16] = 16. - (* Initializer *) - Init: h2_0[17] = 17. - (* Initializer *) - Init: h2_0[18] = 18. - (* Initializer *) - Init: h2_0[19] = 19. - (* Initializer *) - Init: h2_0[20] = 20. - (* Initializer *) - Init: h2_0[21] = 21. - (* Initializer *) - Init: h2_0[22] = 22. - (* Initializer *) - Init: h2_0[23] = 23. - (* Initializer *) - Init: h2_0[24] = 24. - (* Initializer *) - Init: h2_0[25] = 25. - (* Initializer *) - Init: h2_0[26] = 26. - (* Initializer *) - Init: h2_0[27] = 27. - (* Initializer *) - Init: h2_0[28] = 28. - (* Initializer *) - Init: h2_0[29] = 29. - (* Initializer *) - Init: h2_0[30] = 30. - (* Initializer *) - Init: h2_0[31] = 31. - (* Initializer *) - Init: h2_0[32] = 32. - (* Initializer *) - Init: h2_0[33] = 33. - (* Initializer *) - Init: h2_0[34] = 34. - (* Initializer *) - Init: h2_0[35] = 35. - (* Initializer *) - Init: h2_0[36] = 36. - (* Initializer *) - Init: h2_0[37] = 37. - (* Initializer *) - Init: h2_0[38] = 38. - (* Initializer *) - Init: h2_0[39] = 39. - (* Initializer *) - Init: h2_0[40] = 40. - (* Initializer *) - Init: h2_0[41] = 41. - (* Initializer *) - Init: h2_0[42] = 42. - (* Initializer *) - Init: h2_0[43] = 43. - (* Initializer *) - Init: h2_0[44] = 44. - (* Initializer *) - Init: h2_0[45] = 45. - (* Initializer *) - Init: h2_0[46] = 46. - (* Initializer *) - Init: h2_0[47] = 47. - (* Initializer *) - Init: h2_0[48] = 48. - (* Initializer *) - Init: h2_0[49] = 49. - (* Initializer *) - Init: forall i_1 : Z. ((50 <= i_1) -> ((i_1 <= 499) -> (h2_0[i_1] = 0))). - (* Initializer *) Init: h1_0[0] = 0. (* Initializer *) Init: h1_0[1] = 1. @@ -233,6 +131,108 @@ Assume { Init: h1_0[49] = 49. (* Initializer *) Init: forall i_1 : Z. ((50 <= i_1) -> ((i_1 <= 499) -> (h1_0[i_1] = 0))). + (* Initializer *) + Init: h2_0[0] = 0. + (* Initializer *) + Init: h2_0[1] = 1. + (* Initializer *) + Init: h2_0[2] = 2. + (* Initializer *) + Init: h2_0[3] = 3. + (* Initializer *) + Init: h2_0[4] = 4. + (* Initializer *) + Init: h2_0[5] = 5. + (* Initializer *) + Init: h2_0[6] = 6. + (* Initializer *) + Init: h2_0[7] = 7. + (* Initializer *) + Init: h2_0[8] = 8. + (* Initializer *) + Init: h2_0[9] = 9. + (* Initializer *) + Init: h2_0[10] = 10. + (* Initializer *) + Init: h2_0[11] = 11. + (* Initializer *) + Init: h2_0[12] = 12. + (* Initializer *) + Init: h2_0[13] = 13. + (* Initializer *) + Init: h2_0[14] = 14. + (* Initializer *) + Init: h2_0[15] = 15. + (* Initializer *) + Init: h2_0[16] = 16. + (* Initializer *) + Init: h2_0[17] = 17. + (* Initializer *) + Init: h2_0[18] = 18. + (* Initializer *) + Init: h2_0[19] = 19. + (* Initializer *) + Init: h2_0[20] = 20. + (* Initializer *) + Init: h2_0[21] = 21. + (* Initializer *) + Init: h2_0[22] = 22. + (* Initializer *) + Init: h2_0[23] = 23. + (* Initializer *) + Init: h2_0[24] = 24. + (* Initializer *) + Init: h2_0[25] = 25. + (* Initializer *) + Init: h2_0[26] = 26. + (* Initializer *) + Init: h2_0[27] = 27. + (* Initializer *) + Init: h2_0[28] = 28. + (* Initializer *) + Init: h2_0[29] = 29. + (* Initializer *) + Init: h2_0[30] = 30. + (* Initializer *) + Init: h2_0[31] = 31. + (* Initializer *) + Init: h2_0[32] = 32. + (* Initializer *) + Init: h2_0[33] = 33. + (* Initializer *) + Init: h2_0[34] = 34. + (* Initializer *) + Init: h2_0[35] = 35. + (* Initializer *) + Init: h2_0[36] = 36. + (* Initializer *) + Init: h2_0[37] = 37. + (* Initializer *) + Init: h2_0[38] = 38. + (* Initializer *) + Init: h2_0[39] = 39. + (* Initializer *) + Init: h2_0[40] = 40. + (* Initializer *) + Init: h2_0[41] = 41. + (* Initializer *) + Init: h2_0[42] = 42. + (* Initializer *) + Init: h2_0[43] = 43. + (* Initializer *) + Init: h2_0[44] = 44. + (* Initializer *) + Init: h2_0[45] = 45. + (* Initializer *) + Init: h2_0[46] = 46. + (* Initializer *) + Init: h2_0[47] = 47. + (* Initializer *) + Init: h2_0[48] = 48. + (* Initializer *) + Init: h2_0[49] = 49. + (* Initializer *) + Init: forall i_1 : Z. ((50 <= i_1) -> ((i_1 <= 499) -> (h2_0[i_1] = 0))). } Prove: h2_0[i] = h1_0[i]. diff --git a/src/plugins/wp/tests/wp_typed/oracle/array_initialized.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/array_initialized.1.res.oracle index 1d49cea0334d1f281168481586d71e7f6fce8067..9ed2550277e65773a6788deb6913ae35d6a00f29 100644 --- a/src/plugins/wp/tests/wp_typed/oracle/array_initialized.1.res.oracle +++ b/src/plugins/wp/tests/wp_typed/oracle/array_initialized.1.res.oracle @@ -24,8 +24,8 @@ Prove: Mint_0[shift_sint32(a, i)] = 0. ------------------------------------------------------------ Goal Assertion (file array_initialized.c, line 185): -Let a = global(K_h1_26). -Let a_1 = global(K_h2_27). +Let a = global(K_h2_27). +Let a_1 = global(K_h1_26). Assume { (* Goal *) When: (0 <= i) /\ (i <= 499). @@ -236,7 +236,7 @@ Assume { Init: forall i_1 : Z. ((50 <= i_1) -> ((i_1 <= 499) -> (Mint_0[shift_sint32(a, i_1)] = 0))). } -Prove: Mint_0[shift_sint32(a_1, i)] = Mint_0[shift_sint32(a, i)]. +Prove: Mint_0[shift_sint32(a, i)] = Mint_0[shift_sint32(a_1, i)]. ------------------------------------------------------------ ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_typed/oracle/unit_bitwise.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/unit_bitwise.res.oracle index 558b45d9fdf74924a1face948576f5abfc6fa618..7454740a0f188b3058081228b4a2837ba6beeb9f 100644 --- a/src/plugins/wp/tests/wp_typed/oracle/unit_bitwise.res.oracle +++ b/src/plugins/wp/tests/wp_typed/oracle/unit_bitwise.res.oracle @@ -147,8 +147,7 @@ Prove: true. ------------------------------------------------------------ Goal Assertion 'ok' (file unit_bitwise.c, line 117): -Let x = land(1, a). Assume { Type: is_uint8(a) /\ is_uint8(x). } -Prove: 0 <= x. +Prove: true. ------------------------------------------------------------ ------------------------------------------------------------ @@ -161,8 +160,7 @@ Prove: true. ------------------------------------------------------------ Goal Assertion 'ok' (file unit_bitwise.c, line 52): -Let x = land(1, a). Assume { Type: is_uint32(a) /\ is_uint32(x). } -Prove: 0 <= x. +Prove: true. ------------------------------------------------------------ ------------------------------------------------------------ @@ -175,8 +173,7 @@ Prove: true. ------------------------------------------------------------ Goal Assertion 'ok' (file unit_bitwise.c, line 170): -Let x = land(1, a). Assume { Type: is_uint64(a) /\ is_uint64(x). } -Prove: 0 <= x. +Prove: true. ------------------------------------------------------------ ------------------------------------------------------------ @@ -189,8 +186,7 @@ Prove: true. ------------------------------------------------------------ Goal Assertion 'ok' (file unit_bitwise.c, line 165): -Let x = land(1, a). Assume { Type: is_uint16(a) /\ is_uint16(x). } -Prove: 0 <= x. +Prove: true. ------------------------------------------------------------ ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_bitwise.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_bitwise.0.res.oracle index 5c838689f12914c9e16edb03cb53b10e8ec0312c..8c72c29788e6c5de7430921640c4ca0c5b4297fd 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_bitwise.0.res.oracle +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/unit_bitwise.0.res.oracle @@ -29,7 +29,7 @@ [wp] [Qed] Goal typed_lshift_int_ensures_ok : Valid [wp] [Qed] Goal typed_rshift_int_ensures_ok : Valid [wp] [Qed] Goal typed_band1_uint_assert_ok : Valid -[wp] [Alt-Ergo] Goal typed_band1_uint_assert_ok_2 : Valid +[wp] [Qed] Goal typed_band1_uint_assert_ok_2 : Valid [wp] [Qed] Goal typed_band_uint_ensures_ok : Valid [wp] [Qed] Goal typed_bor_uint_ensures_ok : Valid [wp] [Qed] Goal typed_bxor_uint_ensures_ok : Valid @@ -44,7 +44,7 @@ [wp] [Qed] Goal typed_lshift_char_ensures_ok : Valid [wp] [Qed] Goal typed_rshift_char_ensures_ok : Valid [wp] [Qed] Goal typed_band1_uchar_assert_ok : Valid -[wp] [Alt-Ergo] Goal typed_band1_uchar_assert_ok_2 : Valid +[wp] [Qed] Goal typed_band1_uchar_assert_ok_2 : Valid [wp] [Alt-Ergo] Goal typed_band_uchar_ensures_ok : Valid [wp] [Qed] Goal typed_bor_uchar_ensures_ok : Valid [wp] [Qed] Goal typed_bxor_uchar_ensures_ok : Valid @@ -53,9 +53,9 @@ [wp] [Qed] Goal typed_lshift_uchar_ensures_ok : Valid [wp] [Alt-Ergo] Goal typed_rshift_uchar_ensures_ok : Valid [wp] [Qed] Goal typed_band1_ushort_assert_ok : Valid -[wp] [Alt-Ergo] Goal typed_band1_ushort_assert_ok_2 : Valid +[wp] [Qed] Goal typed_band1_ushort_assert_ok_2 : Valid [wp] [Qed] Goal typed_band1_ulong_assert_ok : Valid -[wp] [Alt-Ergo] Goal typed_band1_ulong_assert_ok_2 : Valid +[wp] [Qed] Goal typed_band1_ulong_assert_ok_2 : Valid [wp] [Qed] Goal typed_cast_ensures_ok : Valid [wp] [Qed] Goal typed_cast_assert_ok : Valid [wp] [Qed] Goal typed_cast_assert_ok_2 : Valid @@ -65,8 +65,8 @@ [wp] [Qed] Goal typed_cast_assert_ok_6 : Valid [wp] [Qed] Goal typed_cast_assert_ok_7 : Valid [wp] Proved goals: 61 / 61 - Qed: 41 - Alt-Ergo: 20 + Qed: 45 + Alt-Ergo: 16 ------------------------------------------------------------ Axiomatics WP Alt-Ergo Total Success Lemma 10 8 18 100% @@ -78,7 +78,7 @@ bnot_int 1 - 1 100% lshift_int 1 - 1 100% rshift_int 1 - 1 100% - band1_uint 1 1 2 100% + band1_uint 2 - 2 100% band_uint 1 - 1 100% bor_uint 1 - 1 100% bxor_uint 1 1 2 100% @@ -91,14 +91,14 @@ bnot_char - 1 1 100% lshift_char 1 - 1 100% rshift_char 1 - 1 100% - band1_uchar 1 1 2 100% + band1_uchar 2 - 2 100% band_uchar - 1 1 100% bor_uchar 1 - 1 100% bxor_uchar 1 1 2 100% bnot_uchar 1 - 1 100% lshift_uchar 1 - 1 100% rshift_uchar - 1 1 100% - band1_ushort 1 1 2 100% - band1_ulong 1 1 2 100% + band1_ushort 2 - 2 100% + band1_ulong 2 - 2 100% cast 8 - 8 100% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json deleted file mode 100644 index aa52fbebd0ceb26b098784cbb877f8bdadb051e6..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json +++ /dev/null @@ -1,10 +0,0 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1:int.\n(i_0<=i_138) /\\ (i_1<=i_139) /\\ (0<=i_0) /\\ (i_138<=i_0) /\\ (i_139<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E$i$i0$i$i9" }, - "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0088, - "steps": 24 } ], - "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0116, - "steps": 24 } ] } } ] diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json deleted file mode 100644 index aa52fbebd0ceb26b098784cbb877f8bdadb051e6..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json +++ /dev/null @@ -1,10 +0,0 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1:int.\n(i_0<=i_138) /\\ (i_1<=i_139) /\\ (0<=i_0) /\\ (i_138<=i_0) /\\ (i_139<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E$i$i0$i$i9" }, - "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0088, - "steps": 24 } ], - "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0116, - "steps": 24 } ] } } ] diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part2.json deleted file mode 100644 index 820cbd3fc5e4f803e38f914bb981e386dfc27b4a..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part2.json +++ /dev/null @@ -1,10 +0,0 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1:int.\n(i_0<=i_9) /\\ (i_1<=i_10) /\\ (0<=i_0) /\\ (i_9<=i_0) /\\ (i_10<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E$i$i0$i$i9" }, - "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0124, - "steps": 43 } ], - "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0121, - "steps": 43 } ] } } ] diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json deleted file mode 100644 index abaf79ffd0a939aaa9f4c60806bc8f8890d897a9..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json +++ /dev/null @@ -1,10 +0,0 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_2:int.\n(i_0<=i_1) /\\ (i_2<=i_3) /\\ (0<=i_0) /\\ (i_1<=i_0) /\\ (i_3<=i_2) /\\ (i_0<=9)", - "pattern": "\\E$i$i0$i$i9" }, - "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0074, - "steps": 31 } ], - "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0078, - "steps": 31 } ] } } ] diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json deleted file mode 100644 index a158cb35d7024c69250c2c6f61b9f41654bcb56a..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json +++ /dev/null @@ -1,10 +0,0 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1:int.\n(i_0<=i_158) /\\ (i_1<=i_159) /\\ (0<=i_0) /\\ (i_158<=i_0) /\\ (i_159<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E$i$i0$i$i9" }, - "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.011, - "steps": 16 } ], - "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0092, - "steps": 16 } ] } } ] diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json deleted file mode 100644 index 18643516046a339dee16a82e44473e2dc722f1ac..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json +++ /dev/null @@ -1,10 +0,0 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1:int.\n(i_0<=i_13) /\\ (i_1<=i_14) /\\ (0<=i_0) /\\ (i_13<=i_0) /\\ (i_14<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E$i$i0$i$i9" }, - "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0099, - "steps": 42 } ], - "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0124, - "steps": 42 } ] } } ] diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json deleted file mode 100644 index 522d6695a5bb42790b4084770155336d47a74f8e..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json +++ /dev/null @@ -1,10 +0,0 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_2:int.\n(i_0<=i_1) /\\ (0<=i_0) /\\ (i_1<=i_0) /\\ (j_1<=i_2) /\\ (i_2<=j_1) /\\ (i_0<=9)", - "pattern": "\\E$i0$i$j$j9" }, - "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0094, - "steps": 26 } ], - "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0101, - "steps": 26 } ] } } ] diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json deleted file mode 100644 index 71531584b1405a92d8ecee2ed8fe30b8fd988d3f..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json +++ /dev/null @@ -1,10 +0,0 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1:int.\n(i_0<=i_21) /\\ (i_1<=i_22) /\\ (0<=i_0) /\\ (i_21<=i_0) /\\ (i_22<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E$i$i0$i$i9" }, - "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0098, - "steps": 35 } ], - "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0048, - "steps": 35 } ] } } ] diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json deleted file mode 100644 index 0528b3f539e087d7ffe5b4a4a6ebc4bbce7590eb..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json +++ /dev/null @@ -1,10 +0,0 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1:int.\n(i_0<=i_8) /\\ (i_1<=i_9) /\\ (0<=i_0) /\\ (i_8<=i_0) /\\ (i_9<=i_1) /\\ (i_0<=9)", - "pattern": "\\E$i$i0$i$i9" }, - "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0098, - "steps": 35 } ], - "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0048, - "steps": 35 } ] } } ] diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json deleted file mode 100644 index aa273fd1e8bb18e8fc52a27351743fe17f464122..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json +++ /dev/null @@ -1,10 +0,0 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1:int.\n(i_0<=i_149) /\\ (i_1<=i_150) /\\ (0<=i_0) /\\ (i_149<=i_0) /\\ (i_150<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E$i$i0$i$i9" }, - "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.011, - "steps": 16 } ], - "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0092, - "steps": 16 } ] } } ] diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json deleted file mode 100644 index 3b3491906df49d091101db28c4d58660fed8180a..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json +++ /dev/null @@ -1,10 +0,0 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1:int.\n(i_0<=i_13) /\\ (i_1<=i_14) /\\ (0<=i_0) /\\ (i_13<=i_0) /\\ (i_14<=i_1)\n/\\ (i_0<=9)", - "pattern": "\\E$i$i0$i$i9" }, - "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0139, - "steps": 45 } ], - "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0127, - "steps": 45 } ] } } ] diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json deleted file mode 100644 index c31beeea1dd2a6726bca67f972e4aebb07a292c7..0000000000000000000000000000000000000000 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json +++ /dev/null @@ -1,10 +0,0 @@ -[ { "header": "Split", "tactic": "Wp.split", "params": {}, - "select": { "select": "clause-goal", - "target": "exists i_0,i_1:int.\n(i_0<=i_4) /\\ (i_1<=i_6) /\\ (0<=i_0) /\\ (i_4<=i_0) /\\ (i_6<=i_1) /\\ (i_0<=9)", - "pattern": "\\E$i$i0$i$i9" }, - "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0169, - "steps": 33 } ], - "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0", - "verdict": "valid", "time": 0.0081, - "steps": 33 } ] } } ] diff --git a/src/plugins/wp/wpPropId.ml b/src/plugins/wp/wpPropId.ml index 904d488371713df01e86d8f875623224f47e8378..e9347956373a913c73e20a456495b8b6b4c06209 100644 --- a/src/plugins/wp/wpPropId.ml +++ b/src/plugins/wp/wpPropId.ml @@ -42,10 +42,12 @@ type prop_kind = | PKPropLoop (** loop property used as hypothesis inside a loop. *) | PKVarDecr (** computation related to the decreasing of a variant in a loop *) | PKVarPos (** computation related to a loop variant being positive *) + | PKVarRel (** computation related to a generalized loop variant *) | PKAFctOut (** computation related to the function assigns on normal termination *) | PKAFctExit (** computation related to the function assigns on exit termination *) | PKTerminates (** computation related to the termination *) - | PKSmoke (** expected to fail *) + | PKDecreases (** computation related to the decreases clause *) + | PKSmoke (** expected to fail *) | PKPre of kernel_function * stmt * Property.t (** precondition for function at stmt, property of the require. Many information that should come @@ -74,7 +76,6 @@ let tactical ~gid = (* --- Category --- *) (* -------------------------------------------------------------------------- *) -let kind_of_id p = p.p_kind let parts_of_id p = p.p_part let property_of_id p = p.p_prop let doomed_if_valid p = p.p_doomed @@ -124,6 +125,7 @@ let mk_loop_inv kf s ca = let mk_inv_hyp_id kf s ca = mk_prop PKPropLoop (mk_annot_id kf s ca) let mk_var_decr_id kf s ca = mk_prop PKVarDecr (mk_annot_id kf s ca) let mk_var_pos_id kf s ca = mk_prop PKVarPos (mk_annot_id kf s ca) +let mk_var_id kf s ca = mk_prop PKVarRel (mk_annot_id kf s ca) let mk_loop_from_id kf s ca from = let id = Property.ip_of_from kf (Kstmt s) (Property.Id_loop ca) from in @@ -151,7 +153,7 @@ let mk_disj_bhv_id (kf,ki,active,disj) = let mk_compl_bhv_id (kf,ki,active,comp) = mk_prop PKProp (Property.ip_of_complete kf ki active comp) let mk_decrease_id kf s x = - mk_prop PKProp (Property.ip_of_decreases kf s x) + mk_prop PKDecreases (Property.ip_of_decreases kf s x) let mk_lemma_id l = mk_prop PKProp (LogicUsage.ip_lemma l) @@ -212,13 +214,15 @@ let kind_order = function | PKPreserved -> 3 | PKVarPos -> 4 | PKVarDecr -> 5 - | PKPropLoop -> 6 - | PKAFctOut -> 7 - | PKAFctExit -> 8 - | PKCheck -> 9 - | PKTactic -> 10 - | PKSmoke -> 11 - | PKTerminates -> 12 + | PKVarRel -> 6 + | PKPropLoop -> 7 + | PKAFctOut -> 8 + | PKAFctExit -> 9 + | PKCheck -> 10 + | PKTactic -> 11 + | PKSmoke -> 12 + | PKTerminates -> 13 + | PKDecreases -> 14 let compare_kind k1 k2 = match k1, k2 with PKPre (kf1, ki1, p1), PKPre (kf2, ki2, p2) -> @@ -324,64 +328,6 @@ struct end -module LegacyNames : -sig - val get_prop_id_name: prop_id -> string -end = struct - - let base_id_prop_txt = Property.LegacyNames.get_prop_name_id - - let basename_of_prop_id p = - match p.p_kind , p.p_prop with - | (PKTactic | PKCheck | PKProp | PKPropLoop | PKSmoke | PKTerminates) , p -> - base_id_prop_txt p - | PKEstablished , p -> base_id_prop_txt p ^ "_established" - | PKPreserved , p -> base_id_prop_txt p ^ "_preserved" - | PKVarDecr , p -> base_id_prop_txt p ^ "_decrease" - | PKVarPos , p -> base_id_prop_txt p ^ "_positive" - | PKAFctOut , p -> base_id_prop_txt p ^ "_normal" - | PKAFctExit , p -> base_id_prop_txt p ^ "_exit" - | PKPre(_kf,stmt,pre) , _ -> - let kf_name_of_stmt = - Kernel_function.get_name - (Kernel_function.find_englobing_kf stmt) - in Printf.sprintf "%s_call_%s" kf_name_of_stmt (base_id_prop_txt pre) - - (** function used to normalize basename *) - let normalize_basename s = - (* truncates basename in order to limit length of file name *) - let max_len = Wp_parameters.TruncPropIdFileName.get () in - if max_len > 0 && String.length s > max_len then - if max_len > 3 then (String.sub s 0 (max_len-3)) ^ "___" - else String.sub s 0 max_len - else s - - (** returns the normalized basename of the property. *) - let get_prop_id_basename p = - let basename = basename_of_prop_id p in - let basename = match p.p_part with - | None -> basename - | Some(k,n) -> - if n < 10 then Printf.sprintf "%s_part%d" basename (succ k) else - if n < 100 then Printf.sprintf "%s_part%02d" basename (succ k) else - if n < 1000 then Printf.sprintf "%s_part%03d" basename (succ k) else - Printf.sprintf "%s_part%06d" basename (succ k) - in normalize_basename basename - - - module UniquifyPropId = NameUniquify(PropIdRaw)(struct - let name = "WpProperty" - let basename = get_prop_id_basename - end) - - - (** returns a unique name identifying the property. - This name is built from the basename of the property. *) - let get_prop_id_name pid = - UniquifyPropId.unique_basename pid - -end - (* -------------------------------------------------------------------------- *) (* --- Naming Properties --- *) (* -------------------------------------------------------------------------- *) @@ -416,12 +362,11 @@ struct let get_prop_id_base p = match p.p_kind , p.p_prop with - | (PKTactic | PKCheck | PKProp | PKPropLoop | PKSmoke | PKTerminates) , p -> - get_ip p | PKEstablished , p -> get_ip p ^ "_established" | PKPreserved , p -> get_ip p ^ "_preserved" | PKVarDecr , p -> get_ip p ^ "_decrease" | PKVarPos , p -> get_ip p ^ "_positive" + | PKVarRel , p -> get_ip p ^ "_relation" | PKAFctOut , p -> get_ip p ^ "_normal" | PKAFctExit , p -> get_ip p ^ "_exit" | PKPre(callee_kf,stmt,pre) , _ -> @@ -438,6 +383,9 @@ struct ip_string) in call_string^"_"^ip_string + | _ , p -> + get_ip p + let get_prop_id_basename p = let basename = get_prop_id_base p in @@ -463,9 +411,6 @@ end (* --- Naming Accessors --- *) (* -------------------------------------------------------------------------- *) -let get_legacy = LegacyNames.get_prop_id_name -(** Legacy property PO name *) - let get_propid = Names.get_prop_id_name (** Name related to a property PO *) @@ -567,9 +512,11 @@ let label_of_kind = function | PKPreserved -> "Preservation" | PKVarDecr -> "Decreasing" | PKVarPos -> "Positive" + | PKVarRel -> "Relation" | PKAFctOut -> "Function assigns" | PKAFctExit -> "Exit assigns" | PKTerminates -> "Terminates" + | PKDecreases -> "Decreases" | PKPre(kf,_,_) -> Printf.sprintf "Precondition for '%s'" (Kernel_function.get_name kf) @@ -586,11 +533,13 @@ struct | None -> () | Some(k,n) -> fprintf fmt " (%d/%d)" (succ k) n let pp_subprop fmt p = match p.p_kind with - | PKProp | PKTactic | PKCheck | PKPropLoop | PKSmoke | PKTerminates -> () + | PKProp | PKTactic | PKCheck | PKPropLoop | PKSmoke + | PKTerminates | PKDecreases -> () | PKEstablished -> pp_print_string fmt " (established)" | PKPreserved -> pp_print_string fmt " (preserved)" | PKVarDecr -> pp_print_string fmt " (decrease)" | PKVarPos -> pp_print_string fmt " (positive)" + | PKVarRel -> pp_print_string fmt " (relation)" | PKAFctOut -> pp_print_string fmt " (return)" | PKAFctExit -> pp_print_string fmt " (exit)" | PKPre(kf,_,_) -> fprintf fmt " (call '%s')" (Kernel_function.get_name kf) @@ -662,9 +611,11 @@ let propid_hints hs p = | PKPreserved , _ -> add_required hs "preserved" | PKVarDecr , _ -> add_required hs "decrease" | PKVarPos , _ -> add_required hs "positive" + | PKVarRel , _ -> add_required hs "relation" | PKAFctOut , _ -> add_required hs "return" | PKAFctExit , _ -> add_required hs "exit" | PKTerminates , _ -> add_required hs "terminates" + | PKDecreases , _ -> add_required hs "decreases" | PKPre(kf,st,_) , _ -> add_required hs ("precond-" ^ Kernel_function.get_name kf) ; stmt_hints hs st @@ -674,7 +625,7 @@ let rec term_hints hs t = | TLval(lv,_) -> lval_hints hs lv | TAddrOf(lv,_) -> lval_hints hs lv | TCastE(_,t) -> term_hints hs t - | TBinOp((PlusPI|IndexPI|MinusPI),a,_) -> term_hints hs a + | TBinOp((PlusPI|MinusPI),a,_) -> term_hints hs a | Tlet(_,t) -> term_hints hs t | _ -> () @@ -739,12 +690,13 @@ let prop_id_keys p = let pp_goal_kind fmt = function | PKTactic | PKSmoke | PKCheck - | PKProp | PKPropLoop | PKAFctOut | PKAFctExit | PKTerminates + | PKProp | PKPropLoop | PKAFctOut | PKAFctExit | PKTerminates | PKDecreases | PKPre _ -> () | PKEstablished -> Format.pp_print_string fmt "Establishment of " | PKPreserved -> Format.pp_print_string fmt "Preservation of " | PKVarDecr -> Format.pp_print_string fmt "Decreasing of " | PKVarPos -> Format.pp_print_string fmt "Positivity of " + | PKVarRel -> Format.pp_print_string fmt "Follows relation " let pp_goal_part fmt = function | None -> () @@ -1049,7 +1001,8 @@ let split_map f pid gs = let subproofs id = match id.p_kind with | PKCheck -> 0 - | PKProp | PKSmoke | PKTactic | PKPre _ | PKPropLoop | PKTerminates -> 1 + | PKProp | PKSmoke | PKTactic | PKPre _ | PKPropLoop + | PKTerminates | PKDecreases | PKVarRel -> 1 | PKEstablished | PKPreserved | PKVarDecr | PKVarPos | PKAFctExit | PKAFctOut -> 2 @@ -1057,7 +1010,7 @@ let subproofs id = match id.p_kind with let subproof_idx id = match id.p_kind with | PKCheck -> (-1) (* 0/0 *) | PKProp | PKTactic | PKPre _ | PKSmoke | PKPropLoop - | PKTerminates -> 0 (* 1/1 *) + | PKTerminates | PKDecreases | PKVarRel -> 0 (* 1/1 *) | PKPreserved -> 0 (* 1/2 *) | PKEstablished-> 1 (* 2/2 *) | PKVarDecr -> 0 (* 1/2 *) @@ -1107,7 +1060,8 @@ let get_induction p = | IPAssigns {ias_kf; ias_kinstr=Kstmt stmt} -> Some (ias_kf, stmt) | _ -> None in match p.p_kind with - | PKCheck|PKSmoke |PKAFctOut|PKAFctExit|PKPre _ | PKTactic| PKTerminates -> + | PKCheck | PKSmoke | PKAFctOut | PKAFctExit | PKPre _ + | PKTactic | PKTerminates | PKDecreases -> None | PKProp -> let loop_stmt_opt = match get_stmt (property_of_id p) with @@ -1125,7 +1079,7 @@ let get_induction p = (* loop assigns *) Some stmt | _ -> None (* assert false ??? *) in loop_stmt_opt - | PKEstablished|PKVarDecr|PKVarPos|PKPreserved -> + | PKEstablished|PKVarDecr|PKVarPos|PKVarRel|PKPreserved -> (match get_stmt (property_of_id p) with | None -> None | Some (_, s) -> Some s) diff --git a/src/plugins/wp/wpPropId.mli b/src/plugins/wp/wpPropId.mli index 4be96caf2049b165a4fe196bc98ffd91f1701e07..d56bc1a62516d1d31a3b8c45a0927323b47e4f8d 100644 --- a/src/plugins/wp/wpPropId.mli +++ b/src/plugins/wp/wpPropId.mli @@ -79,7 +79,6 @@ val ident_names : string list -> string list val prop_id_keys : prop_id -> string list * string list (* required , hints *) val get_propid : prop_id -> string (** Unique identifier of [prop_id] *) -val get_legacy : prop_id -> string (** Unique legacy identifier of [prop_id] *) val pp_propid : Format.formatter -> prop_id -> unit (** Print unique id of [prop_id] *) val user_pred_names: toplevel_predicate -> string list @@ -89,23 +88,6 @@ val are_selected_names: string list -> string list -> bool (** [are_selected_names asked names] checks if [names] of a property are selected according to [asked] names. *) -type prop_kind = - | PKTactic (** tactical sub-goal *) - | PKCheck (** internal check *) - | PKProp (** normal property *) - | PKEstablished (** computation related to a loop property before the loop. *) - | PKPreserved (** computation related to a loop property inside the loop. *) - | PKPropLoop (** loop property used as hypothesis inside a loop. *) - | PKVarDecr (** computation related to the decreasing of a variant in a loop *) - | PKVarPos (** computation related to a loop variant being positive *) - | PKAFctOut (** computation related to the function assigns on normal termination *) - | PKAFctExit (** computation related to the function assigns on exit termination *) - | PKTerminates (** computation related to the termination *) - | PKSmoke (** smoke property *) - | PKPre of kernel_function * stmt * Property.t (** precondition for function - at stmt, property of the require. Many information that should come - from the p_prop part of the prop_id, but in the PKPre case, - it seems that it is hidden in a IPBlob property ! *) val pretty : Format.formatter -> prop_id -> unit val pretty_context : Description.kf -> Format.formatter -> prop_id -> unit @@ -145,6 +127,9 @@ val mk_var_decr_id : kernel_function -> stmt -> code_annotation -> prop_id (** Variant positive *) val mk_var_pos_id : kernel_function -> stmt -> code_annotation -> prop_id +(** Variant for *) +val mk_var_id : kernel_function -> stmt -> code_annotation -> prop_id + (** \from property of loop assigns. Must not be [FromAny] *) val mk_loop_from_id : kernel_function -> stmt -> code_annotation -> from -> prop_id @@ -281,9 +266,6 @@ val split_map : (prop_id -> 'a -> 'b) -> prop_id -> 'a list -> 'b list (** [mk_part pid (k, n)] build the identification for the [k/n] part of [pid].*) val mk_part : prop_id -> (int * int) -> prop_id -(** get the 'kind' information. *) -val kind_of_id : prop_id -> prop_kind - (** get the 'part' information. *) val parts_of_id : prop_id -> (int * int) option diff --git a/src/plugins/wp/wp_parameters.ml b/src/plugins/wp/wp_parameters.ml index dc79e210748ecd85b04709cf90740216284a0fb8..b2e348d0c8101f2e2379c2f1c338c4921d9fab20 100644 --- a/src/plugins/wp/wp_parameters.ml +++ b/src/plugins/wp/wp_parameters.ml @@ -35,6 +35,11 @@ let warning ?wkey ?current = match current with | None -> warning ?wkey ~current:true | Some b -> warning ?wkey ~current:b +let wkey_hyp = register_warn_category "hypothesis" + +let hypothesis ?current ?source ?emitwith ?echo ?once ?append text = + warning ~wkey:wkey_hyp ?current ?source ?emitwith ?echo ?once ?append text + let resetdemon = ref [] let on_reset f = resetdemon := f :: !resetdemon let reset () = List.iter (fun f -> f ()) !resetdemon @@ -880,105 +885,6 @@ module BackTrack = Int Limits backtracking when applying strategies." end) -let () = Parameter_customize.set_group wp_prover_options -module Script = - String(struct - let option_name = "-wp-coq-script" - let arg_name = "f.script" - let default = "" - let help = "Set user's file for Coq proofs." - end) - -let () = Parameter_customize.set_group wp_prover_options -module UpdateScript = - True(struct - let option_name = "-wp-update-coq-script" - let help = "If turned off, do not save or modify user's proofs." - end) - -let () = Parameter_customize.set_group wp_prover_options -module CoqTimeout = - Int(struct - let option_name = "-wp-coq-timeout" - let default = 30 - let arg_name = "n" - let help = - Printf.sprintf - "Set the timeout (in seconds) for Coq (default: %d)." default - end) - -let () = Parameter_customize.set_group wp_prover_options -module CoqCompiler = - String(struct - let option_name = "-wp-coqc" - let default = "coqc" - let arg_name = "cmd" - let help = - Printf.sprintf - "Set the command line to run Coq Compiler (default 'coqc')." - end) - -let () = Parameter_customize.set_group wp_prover_options -module CoqIde = - String(struct - let option_name = "-wp-coqide" - let default = "coqide" - let arg_name = "cmd" - let help = - Printf.sprintf - "Set the command line to run CoqIde (default 'coqide')\n\ - If the command-line contains 'emacs' (case insentive),\n\ - a coq-project file is used instead of coq options." - end) - -let () = Parameter_customize.set_group wp_prover_options -module CoqProject = - String(struct - let option_name = "-wp-coq-project" - let default = "_CoqProject" - let arg_name = "file" - let help = - Printf.sprintf - "Set the Coq-Project file to used with Proof General (default '_CoqProject')" - end) - -let () = Parameter_customize.set_group wp_prover_options -module CoqTactic = - String - (struct - let option_name = "-wp-coq-tactic" - let arg_name = "proof" - let default = "auto with zarith" - let help = "Default tactic for Coq" - end) - -let () = Parameter_customize.set_group wp_prover_options -module TryHints = - False - (struct - let option_name = "-wp-coq-tryhints" - let help = "Try scripts from other goals (see also -wp-hints)" - end) - -let () = Parameter_customize.set_group wp_prover_options -module Hints = - Int - (struct - let option_name = "-wp-coq-hints" - let arg_name = "n" - let default = 3 - let help = "Maximum number of proposed Coq scripts (default 3)" - end) - -let () = Parameter_customize.set_group wp_prover_options -module CoqLibs = - String_list - (struct - let option_name = "-wp-coq-lib" - let arg_name = "*.v,*.vo" - let help = "Additional libraries for Coq" - end) - let () = Parameter_customize.set_group wp_prover_options let () = Parameter_customize.no_category () module Why3Flags = @@ -989,43 +895,6 @@ module Why3Flags = let help = "Additional options for Why3" end) -let () = Parameter_customize.set_group wp_prover_options -module AltErgo = - String(struct - let option_name = "-wp-alt-ergo" - let default = "alt-ergo" - let arg_name = "<cmd>" - let help = "Command to run alt-ergo (default: 'alt-ergo')" - end) - -let () = Parameter_customize.set_group wp_prover_options -module AltGrErgo = - String(struct - let option_name = "-wp-altgr-ergo" - let default = "altgr-ergo" - let arg_name = "<cmd>" - let help = "Command to run alt-ergo user interface (default: 'altgr-ergo')" - end) - -let () = Parameter_customize.set_group wp_prover_options -module AltErgoLibs = - String_list - (struct - let option_name = "-wp-alt-ergo-lib" - let arg_name = "*.mlw" - let help = "Additional library file for Alt-Ergo" - end) - -let () = Parameter_customize.set_group wp_prover_options -let () = Parameter_customize.no_category () -module AltErgoFlags = - String_list - (struct - let option_name = "-wp-alt-ergo-opt" - let arg_name = "option,..." - let help = "Additional options for Alt-Ergo" - end) - (* ------------------------------------------------------------------------ *) (* --- PO Management --- *) (* ------------------------------------------------------------------------ *) diff --git a/src/plugins/wp/wp_parameters.mli b/src/plugins/wp/wp_parameters.mli index 1b2e995888b805f310e22c1cc9a346b314092a96..e1b72778280ab32247250c2c94c2bdc4746cb71d 100644 --- a/src/plugins/wp/wp_parameters.mli +++ b/src/plugins/wp/wp_parameters.mli @@ -23,6 +23,7 @@ include Plugin.S val reset : unit -> unit +val hypothesis : 'a Log.pretty_printer (** {2 Function Selection} *) @@ -117,29 +118,15 @@ module CacheEnv: Parameter_sig.Bool module CacheDir: Parameter_sig.String module CachePrint: Parameter_sig.Bool module Drivers: Parameter_sig.String_list -module Script: Parameter_sig.String -module UpdateScript: Parameter_sig.Bool module Timeout: Parameter_sig.Int module SmokeTimeout: Parameter_sig.Int module InteractiveTimeout: Parameter_sig.Int module TimeExtra: Parameter_sig.Int module TimeMargin: Parameter_sig.Int -module CoqTimeout: Parameter_sig.Int -module CoqCompiler : Parameter_sig.String -module CoqIde : Parameter_sig.String -module CoqProject : Parameter_sig.String module Steps: Parameter_sig.Int module Procs: Parameter_sig.Int module ProofTrace: Parameter_sig.Bool -module CoqLibs: Parameter_sig.String_list -module CoqTactic: Parameter_sig.String -module Hints: Parameter_sig.Int -module TryHints: Parameter_sig.Bool module Why3Flags: Parameter_sig.String_list -module AltErgo: Parameter_sig.String -module AltGrErgo: Parameter_sig.String -module AltErgoLibs: Parameter_sig.String_list -module AltErgoFlags: Parameter_sig.String_list module Auto: Parameter_sig.String_list module AutoDepth: Parameter_sig.Int diff --git a/src/plugins/wp/wpo.ml b/src/plugins/wp/wpo.ml index d94196679bf26f7b825d4f23d4ab8fcc44ca70ea..a309ee7ed01ee5101ff5e455e720ff4298f7056f 100644 --- a/src/plugins/wp/wpo.ml +++ b/src/plugins/wp/wpo.ml @@ -106,9 +106,7 @@ struct let file_goal ~pid ~model ~prover = let ext = match prover with | Qed -> "qed" - | NativeAltErgo -> "mlw" | Why3 _ -> "why" - | NativeCoq -> "v" | Tactical -> "tac" in let id = WpPropId.get_propid pid in @@ -117,9 +115,7 @@ struct let file_kf ~kf ~model ~prover = let ext = match prover with | Qed -> "qed" - | NativeAltErgo -> "mlw" | Why3 _ -> "why" - | NativeCoq -> "v" | Tactical -> "tac" in let id = (Kf.vi kf).vname in @@ -378,7 +374,6 @@ type formula = type po = t and t = { po_gid : string ; (* goal identifier *) - po_leg : string ; (* legacy goal identifier *) po_sid : string ; (* goal short identifier (without model) *) po_name : string ; (* goal informal name *) po_idx : index ; (* goal index *) @@ -456,7 +451,6 @@ module S = po_pid = List.hd WpPropId.PropId.reprs; po_sid = ""; po_gid = ""; - po_leg = ""; po_model = WpContext.MODEL.repr ; po_name = "dummy"; po_formula = GoalAnnot VC_Annot.repr ; @@ -472,7 +466,7 @@ module ProverType = type t = prover include Datatype.Undefined let name = "Wpo.prover" - let reprs = [ NativeAltErgo; NativeCoq; Qed ] + let reprs = [ Qed ] end) (* to get a "reasonable" API doc: *) let () = Type.set_ml_name ProverType.ty (Some "Wpo.prover") diff --git a/src/plugins/wp/wpo.mli b/src/plugins/wp/wpo.mli index 580b64694974e7616ee540e1c31dd8e83d09b8ac..763b485f663b2b049da7fd7f366301799fe7b996 100644 --- a/src/plugins/wp/wpo.mli +++ b/src/plugins/wp/wpo.mli @@ -104,7 +104,6 @@ type formula = type po = t and t = { po_gid : string ; (** goal identifier *) - po_leg : string ; (** legacy goal identifier *) po_sid : string ; (** goal short identifier (without model) *) po_name : string ; (** goal informal name *) po_idx : index ; (** goal index *) diff --git a/tests/compliance/check-json.i b/tests/compliance/check-json.i index b4c5e6c33fc7f804398a3320873a02c67a4440cc..99a889344abf1496eaf7701a4e17589f3d3611cf 100644 --- a/tests/compliance/check-json.i +++ b/tests/compliance/check-json.i @@ -5,4 +5,5 @@ EXECNOW: LOG json_@PTEST_NAME@_2.txt python3 -m json.tool < @SHARE@/glibc_functions.json | head -n 2 > @PTEST_RESULT@/json_@PTEST_NAME@_2.txt 2> @DEV_NULL@ EXECNOW: LOG json_@PTEST_NAME@_3.txt python3 -m json.tool < @SHARE@/nonstandard_identifiers.json | head -n 2 > @PTEST_RESULT@/json_@PTEST_NAME@_3.txt 2> @DEV_NULL@ EXECNOW: LOG json_@PTEST_NAME@_4.txt python3 -m json.tool < @SHARE@/posix_identifiers.json | head -n 2 > @PTEST_RESULT@/json_@PTEST_NAME@_4.txt 2> @DEV_NULL@ + EXECNOW: LOG json_@PTEST_NAME@_5.txt python3 @PTEST_DIR@/sanity-checks.py @SHARE@ > @PTEST_RESULT@/json_@PTEST_NAME@_5.txt 2> @DEV_NULL@ */ diff --git a/tests/compliance/oracle/json_check-json_1.txt b/tests/compliance/oracle/json_check-json_1.txt index 1c7fc7039ae9a32a7e24b026fa194ade1cc32984..1b5870264ab3d7511f6c0ec3cce36b2ddf76554c 100644 --- a/tests/compliance/oracle/json_check-json_1.txt +++ b/tests/compliance/oracle/json_check-json_1.txt @@ -1,2 +1,2 @@ { - "description": "C11 reserved function identifiers", + "description": "C11 reserved function and macro identifiers", diff --git a/tests/compliance/oracle/json_check-json_5.txt b/tests/compliance/oracle/json_check-json_5.txt new file mode 100644 index 0000000000000000000000000000000000000000..7a7ac78c07c94eab5f3e5cbdd027727aa0dd3148 --- /dev/null +++ b/tests/compliance/oracle/json_check-json_5.txt @@ -0,0 +1,2 @@ +../../../share/compliance/posix_identifiers.json checked. +../../../share/compliance/c11_functions.json checked. diff --git a/tests/compliance/sanity-checks.py b/tests/compliance/sanity-checks.py new file mode 100755 index 0000000000000000000000000000000000000000..3a7418b6414ecad96ed170dd867841fd0c6ac54f --- /dev/null +++ b/tests/compliance/sanity-checks.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +#-*- coding: utf-8 -*- + +# Perform some sanity checks related to the compliance JSON files + +import json +import sys +from pathlib import Path + +if len(sys.argv) < 2: + sys.exit(f"usage: {sys.argv[0]} dir (where dir is FRAMAC_SHARE/compliance)") + +compliance_dir = sys.argv[1] + +posix_ids_path = Path(compliance_dir) / "posix_identifiers.json" +posix_headers = set() +posix_dict = {} +with open(posix_ids_path) as data: + js = json.load(data) + posix_dict = js["data"] + id_types = set(e["type"] for e in js["id_types"]) + posix_headers = set(js["headers"].keys()) + extension_names = set(js["extension_names"].keys()) + unique_ids = set() + for (i, v) in posix_dict.items(): + if i in unique_ids: + sys.exit("duplicate id {i}") + unique_ids.add(i) + id_type = v["id_type"] + if id_type not in id_types: + sys.exit(f"error: unknown id_type '{id_type}' for id {i}") + header = v["header"] + if header not in posix_headers: + sys.exit(f"error: unknown header {header} for id {i}") + exts = set(v["extensions"]) + unknown_exts = exts - extension_names + if unknown_exts: + sys.exit(f"error: unknown extension(s) {unknown_exts} for id {i}") +print(f"{posix_ids_path} checked.") + +c11_headers_path = Path(compliance_dir) / "c11_headers.json" +c11_headers = [] +with open(c11_headers_path) as data: + js = json.load(data) + c11_headers = js["data"] + +c11_funs_path = Path(compliance_dir) / "c11_functions.json" +c11_funs = [] +with open(c11_funs_path) as data: + js = json.load(data) + c11_funs = js["data"] + +for (i, v) in c11_funs.items(): + header = v["header"] + if header not in c11_headers: + sys.exit(f"error: unknown header {header} for id {i}") + if i not in posix_dict: + if "notes" in v: + if "not-in-posix" not in v["notes"]: + print(f"warning: C11 identifier unexpectedly not in POSIX: {i}") + else: + if "notes" in v and "not-in-posix" in v["notes"]: + print(f"warning: C11 identifier unexpectedly found in POSIX: {i}") + id_type = posix_dict[i]["id_type"] + if id_type != "function": + if "notes" in v and "macro" in v["notes"]: + if id_type != "macro": + print(f"warning: C11 macro {i} is not a macro in POSIX, but a {id_type}") + else: + print(f"warning: C11 function {i} is not a function in POSIX, but a {id_type}") + posix_header = posix_dict[i]["header"] + if header != posix_header: + sys.exit(f"error: C11 function {i} mapped to header {header}, but in POSIX it is mapped to header {posix_header}") +print(f"{c11_funs_path} checked.") diff --git a/tests/float/absorb.c b/tests/float/absorb.c index 656a6b9bc1ee85ae90e3f525027d76edad9d7baf..c53452aa6966c517b9b960fc3dad049dabec7538 100644 --- a/tests/float/absorb.c +++ b/tests/float/absorb.c @@ -1,22 +1,26 @@ /* run.config COMMENT: run.config is intentionally not-* -PLUGIN: + PLUGIN: EXECNOW: BIN absorb.sav LOG absorb_sav.res LOG absorb_sav.err @frama-c@ -save @PTEST_RESULT@/absorb.sav @PTEST_FILE@ > @PTEST_RESULT@/absorb_sav.res 2> @PTEST_RESULT@/absorb_sav.err -PLUGIN: @EVA_PLUGINS@ + PLUGIN: @EVA_PLUGINS@ EXECNOW: BIN absorb.sav2 LOG absorb_sav2.res LOG absorb_sav2.err @frama-c@ -load %{dep:@PTEST_RESULT@/absorb.sav} -eva @EVA_CONFIG@ -float-hex -save @PTEST_RESULT@/absorb.sav2 > @PTEST_RESULT@/absorb_sav2.res 2> @PTEST_RESULT@/absorb_sav2.err + COMMENT: the following CMD redefinition omits adding @PTEST_FILE@ on purpose. + CMD: @frama-c@ @PTEST_OPTIONS@ OPT: -load %{dep:@PTEST_RESULT@/absorb.sav2} -deps -out -input */ /* run.config* DONTRUN: */ #include "__fc_builtin.h" + float x = 1.0, y = 0.0, z, t, min_f, min_fl, den; + void main() { long long b = Frama_C_interval(-2000000001, 2000000001); b = b * b; z = y + 1e-286; while (y != x) - { + { y = x ; x+=1E-286; } t = b; diff --git a/tests/float/oracle/absorb.res.oracle b/tests/float/oracle/absorb.res.oracle index e65974a16042b3455328846be038095c5823a861..1b5788d6e983af2f8621e1a5b3818f191b9e2b39 100644 --- a/tests/float/oracle/absorb.res.oracle +++ b/tests/float/oracle/absorb.res.oracle @@ -1,4 +1,3 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. [from] Computing for function main [from] Computing for function Frama_C_interval <-main [from] Done for function Frama_C_interval diff --git a/tests/float/oracle/absorb_sav.res b/tests/float/oracle/absorb_sav.res index a618fee603c74d4ec344f842264c96a1263f1094..280a79a32b2a298c2da2a13e2f5a05d8d007b572 100644 --- a/tests/float/oracle/absorb_sav.res +++ b/tests/float/oracle/absorb_sav.res @@ -1,4 +1,4 @@ [kernel] Parsing absorb.c (with preprocessing) -[kernel:parser:decimal-float] absorb.c:17: Warning: +[kernel:parser:decimal-float] absorb.c:21: Warning: Floating-point constant 1e-286 is not represented exactly. Will use 0x1.e74404f3daadbp-951. (warn-once: no further messages from category 'parser:decimal-float' will be emitted) diff --git a/tests/float/oracle/absorb_sav2.res b/tests/float/oracle/absorb_sav2.res index 0e6e5f6ef81892ec580bfcb78555dbae39034e45..b34d714dc2c19196b811c578a6f23f2753032f77 100644 --- a/tests/float/oracle/absorb_sav2.res +++ b/tests/float/oracle/absorb_sav2.res @@ -10,12 +10,12 @@ min_fl ∈ {0} den ∈ {0} [eva] computing for function Frama_C_interval <- main. - Called from absorb.c:15. + Called from absorb.c:19. [eva] using specification for function Frama_C_interval -[eva] absorb.c:15: +[eva] absorb.c:19: function Frama_C_interval: precondition 'order' got status valid. [eva] Done for function Frama_C_interval -[eva] absorb.c:18: starting to merge loop iterations +[eva] absorb.c:22: starting to merge loop iterations [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== diff --git a/tests/journal/control.i b/tests/journal/control.i index 092afe2d239cccf9ed270389b444989500316f10..ec7902161dda42107bb8d9219dca2ccd293a1079 100644 --- a/tests/journal/control.i +++ b/tests/journal/control.i @@ -1,4 +1,6 @@ /* run.config + COMMENT: the following CMD redefinition omits adding @PTEST_FILE@ on purpose (due to -load) + CMD: @frama-c@ @PTEST_OPTIONS@ COMMENT: do not compare generated journals since they depend on current time PLUGIN: @EVA_PLUGINS@ EXECNOW: BIN control_journal.ml @frama-c@ @PTEST_FILE@ -journal-enable -eva -deps -out @EVA_OPTIONS@ -main f -journal-name @PTEST_RESULT@/control_journal.ml > @DEV_NULL@ 2> @DEV_NULL@ diff --git a/tests/journal/control2.c b/tests/journal/control2.c index 885d7f07b81496997a68cdd8dc6f8473b7dbd5b8..9570c6dd3afb3e59c787a9f04594244b196b4e0c 100644 --- a/tests/journal/control2.c +++ b/tests/journal/control2.c @@ -1,4 +1,6 @@ /* run.config + COMMENT: the following CMD redefinition omits adding @PTEST_FILE@ on purpose (due to -load) + CMD: @frama-c@ @PTEST_OPTIONS@ PLUGIN: @EVA_PLUGINS@ EXECNOW: BIN control_journal2.ml @frama-c@ -journal-enable -eva -deps -out -main f -journal-name @PTEST_RESULT@/control_journal2.ml @PTEST_FILE@ > @DEV_NULL@ 2> @DEV_NULL@ SCRIPT: @PTEST_RESULT@/control_journal2.ml diff --git a/tests/journal/intra.i b/tests/journal/intra.i index f19b1d606e2881b0abda42cc04213ea7cd16dc23..5ae163e21ff0267076ad57e04d8ddcfc17e1bc2e 100644 --- a/tests/journal/intra.i +++ b/tests/journal/intra.i @@ -1,4 +1,6 @@ /* run.config + COMMENT: the following CMD redefinition omits adding @PTEST_FILE@ on purpose (due to -load) + CMD: @frama-c@ @PTEST_OPTIONS@ PLUGIN: @EVA_PLUGINS@ sparecode MODULE: @PTEST_NAME@ EXECNOW: BIN intra_journal.ml @frama-c@ -eva-show-progress -journal-enable -journal-name @PTEST_RESULT@/intra_journal.ml @PTEST_FILE@ > @DEV_NULL@ 2> @DEV_NULL@ diff --git a/tests/journal/oracle/control.0.res.oracle b/tests/journal/oracle/control.0.res.oracle index f97cd8e9dafd9a3774d5e3a1003d90f598feded1..8191206632c5a2badf8b201659e3bc09e88640bc 100644 --- a/tests/journal/oracle/control.0.res.oracle +++ b/tests/journal/oracle/control.0.res.oracle @@ -7,8 +7,8 @@ y ∈ {0} c ∈ {0} d ∈ {0} -[eva] control.i:22: starting to merge loop iterations -[eva:alarm] control.i:25: Warning: signed overflow. assert x + 1 ≤ 2147483647; +[eva] control.i:24: starting to merge loop iterations +[eva:alarm] control.i:27: Warning: signed overflow. assert x + 1 ≤ 2147483647; [eva] Recording results for f [eva] done for function f [eva] ====== VALUES COMPUTED ====== @@ -29,7 +29,6 @@ ---------------------------------------------------------------------------- [from] Computing for function f [from] Done for function f -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. [from] ====== DEPENDENCIES COMPUTED ====== These dependencies hold at termination for the executions that terminate: [from] Function f: diff --git a/tests/journal/oracle/control.1.res.oracle b/tests/journal/oracle/control.1.res.oracle index 0f89b91f804351f04acb5d47bfc56735386ec5b8..ae023e8b8226ac8ac7a2e86a190dc09f5e2bcd72 100644 --- a/tests/journal/oracle/control.1.res.oracle +++ b/tests/journal/oracle/control.1.res.oracle @@ -7,8 +7,8 @@ y ∈ {0} c ∈ {0} d ∈ {0} -[eva] control.i:22: starting to merge loop iterations -[eva:alarm] control.i:25: Warning: signed overflow. assert x + 1 ≤ 2147483647; +[eva] control.i:24: starting to merge loop iterations +[eva:alarm] control.i:27: Warning: signed overflow. assert x + 1 ≤ 2147483647; [eva] Recording results for f [eva] done for function f [eva] ====== VALUES COMPUTED ====== @@ -29,7 +29,6 @@ ---------------------------------------------------------------------------- [from] Computing for function f [from] Done for function f -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. [from] ====== DEPENDENCIES COMPUTED ====== These dependencies hold at termination for the executions that terminate: [from] Function f: @@ -43,7 +42,7 @@ y ∈ {0} c ∈ {0} d ∈ {0} -[eva:alarm] control.i:25: Warning: signed overflow. assert x + 1 ≤ 2147483647; +[eva:alarm] control.i:27: Warning: signed overflow. assert x + 1 ≤ 2147483647; [eva] Recording results for f [from] Computing for function f [from] Done for function f @@ -57,9 +56,7 @@ 1 function analyzed (out of 1): 100% coverage. In this function, 9 statements reached (out of 12): 75% coverage. ---------------------------------------------------------------------------- - Some errors and warnings have been raised during the analysis: - by the Eva analyzer: 0 errors 0 warnings - by the Frama-C kernel: 0 errors 1 warning + No errors or warnings raised during the analysis. ---------------------------------------------------------------------------- 1 alarm generated by the analysis: 1 integer overflow diff --git a/tests/journal/oracle/control.2.res.oracle b/tests/journal/oracle/control.2.res.oracle index fb87aaecc1b1525a11fa7308b14d5825ee587f66..2c9d316b3d61cb2542d43b9dcd9eea66d30c10b0 100644 --- a/tests/journal/oracle/control.2.res.oracle +++ b/tests/journal/oracle/control.2.res.oracle @@ -1,7 +1,6 @@ 1 2 3 -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. 1 2 3 diff --git a/tests/journal/oracle/control2.res.oracle b/tests/journal/oracle/control2.res.oracle index acf4746fb0c54e7a06c20e5f47a5a29fc7244bd7..97fb53bb8f67b370c1e94911f5b7ef2df89199fc 100644 --- a/tests/journal/oracle/control2.res.oracle +++ b/tests/journal/oracle/control2.res.oracle @@ -7,8 +7,8 @@ y ∈ {0} c ∈ {0} d ∈ {0} -[eva] control2.c:12: starting to merge loop iterations -[eva:alarm] control2.c:15: Warning: +[eva] control2.c:14: starting to merge loop iterations +[eva:alarm] control2.c:17: Warning: signed overflow. assert x + 1 ≤ 2147483647; [eva] done for function f [eva] ====== VALUES COMPUTED ====== @@ -37,12 +37,12 @@ y ∈ [--..--] c ∈ [--..--] d ∈ [--..--] -[eva:alarm] control2.c:13: Warning: +[eva:alarm] control2.c:15: Warning: signed overflow. assert y + 1 ≤ 2147483647; -[eva:alarm] control2.c:13: Warning: - signed overflow. assert x + 1 ≤ 2147483647; [eva:alarm] control2.c:15: Warning: signed overflow. assert x + 1 ≤ 2147483647; +[eva:alarm] control2.c:17: Warning: + signed overflow. assert x + 1 ≤ 2147483647; [eva] done for function f [eva] ====== VALUES COMPUTED ====== [eva:final-states] Values at end of function f: @@ -63,7 +63,6 @@ ---------------------------------------------------------------------------- [from] Computing for function f [from] Done for function f -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. [from] ====== DEPENDENCIES COMPUTED ====== These dependencies hold at termination for the executions that terminate: [from] Function f: diff --git a/tests/journal/oracle/control2_sav.res b/tests/journal/oracle/control2_sav.res index 2a9246db51c537dbcb841ca4f96aa7170df83043..1734f9bb5372539b42ca6899a554625e521d5272 100644 --- a/tests/journal/oracle/control2_sav.res +++ b/tests/journal/oracle/control2_sav.res @@ -7,8 +7,8 @@ y ∈ {0} c ∈ {0} d ∈ {0} -[eva] control2.c:12: starting to merge loop iterations -[eva:alarm] control2.c:15: Warning: +[eva] control2.c:14: starting to merge loop iterations +[eva:alarm] control2.c:17: Warning: signed overflow. assert x + 1 ≤ 2147483647; [eva] done for function f [eva] ====== VALUES COMPUTED ====== @@ -38,12 +38,12 @@ y ∈ [--..--] c ∈ [--..--] d ∈ [--..--] -[eva:alarm] control2.c:13: Warning: +[eva:alarm] control2.c:15: Warning: signed overflow. assert y + 1 ≤ 2147483647; -[eva:alarm] control2.c:13: Warning: - signed overflow. assert x + 1 ≤ 2147483647; [eva:alarm] control2.c:15: Warning: signed overflow. assert x + 1 ≤ 2147483647; +[eva:alarm] control2.c:17: Warning: + signed overflow. assert x + 1 ≤ 2147483647; [eva] done for function f [eva] ====== VALUES COMPUTED ====== [eva:final-states] Values at end of function f: diff --git a/tests/journal/oracle/intra.res.oracle b/tests/journal/oracle/intra.res.oracle index 1d0c56f4f1dfc363f663efd08c22315be831b308..1cd1571223722dac18125880403465facf99258e 100644 --- a/tests/journal/oracle/intra.res.oracle +++ b/tests/journal/oracle/intra.res.oracle @@ -8,49 +8,49 @@ X10 ∈ {0} Y10 ∈ {0} [eva] computing for function param <- main. - Called from intra.i:81. + Called from intra.i:83. [eva] Recording results for param [eva] Done for function param [eva] computing for function tmp <- main. - Called from intra.i:82. -[eva] intra.i:20: assertion got status valid. + Called from intra.i:84. [eva] intra.i:22: assertion got status valid. +[eva] intra.i:24: assertion got status valid. [eva] Recording results for tmp [eva] Done for function tmp [eva] computing for function spare_called_fct <- main. - Called from intra.i:83. + Called from intra.i:85. [eva] Recording results for spare_called_fct [eva] Done for function spare_called_fct [eva] computing for function call_two_outputs <- main. - Called from intra.i:84. + Called from intra.i:86. [eva] computing for function two_outputs <- call_two_outputs <- main. - Called from intra.i:48. + Called from intra.i:50. [eva] Recording results for two_outputs [eva] Done for function two_outputs [eva] computing for function two_outputs <- call_two_outputs <- main. - Called from intra.i:52. + Called from intra.i:54. [eva] Recording results for two_outputs [eva] Done for function two_outputs [eva] Recording results for call_two_outputs [eva] Done for function call_two_outputs [eva] computing for function loop <- main. - Called from intra.i:85. -[eva] intra.i:63: assertion got status valid. -[eva] intra.i:64: loop invariant got status valid. -[eva] intra.i:66: starting to merge loop iterations + Called from intra.i:87. +[eva] intra.i:65: assertion got status valid. +[eva] intra.i:66: loop invariant got status valid. +[eva] intra.i:68: starting to merge loop iterations [eva] Recording results for loop [eva] Done for function loop [eva] computing for function assign <- main. - Called from intra.i:86. + Called from intra.i:88. [eva] Recording results for assign [eva] Done for function assign [eva] computing for function assign <- main. - Called from intra.i:87. + Called from intra.i:89. [eva] Recording results for assign [eva] Done for function assign [eva] computing for function stop <- main. - Called from intra.i:90. -[kernel:annot:missing-spec] intra.i:90: Warning: + Called from intra.i:92. +[kernel:annot:missing-spec] intra.i:92: Warning: Neither code nor specification for function stop, generating default assigns from the prototype [eva] using specification for function stop [eva] Done for function stop @@ -114,4 +114,3 @@ [pdg] done for function stop [sparecode] remove unused global declarations... [sparecode] result in new project 'default without sparecode'. -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/libc/check_const.ml b/tests/libc/check_const.ml index 3538cedcae139b2d99c4f48b283e9f548a5c67d7..710373708e0e41f8b386ecc4773030c6e56ba713 100644 --- a/tests/libc/check_const.ml +++ b/tests/libc/check_const.ml @@ -46,7 +46,7 @@ let check_annot kf _ (a: identified_predicate) = warn typ vi t.term_loc | _ -> () end - | TBinOp ((PlusPI | MinusPI | IndexPI), + | TBinOp ((PlusPI | MinusPI), ({term_node = TLval (TVar lvi, _)} | {term_node = TCastE (_, {term_node = TLval (TVar lvi, _)})}), _) diff --git a/tests/libc/check_some_metrics.sh b/tests/libc/check_some_metrics.sh new file mode 100755 index 0000000000000000000000000000000000000000..75e2282e30f33f7121824f196d86c290e6a997a3 --- /dev/null +++ b/tests/libc/check_some_metrics.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash + +# Perform some checks on the output of the Metrics plugin, but avoiding +# too many details which cause conflicts during merge of libc branches. +# +# This script expects a multiple of 5 arguments containing the expressions +# to compare for each 'run' of metrics: the first argument will be compared +# to the number of defined functions; the second argument to the number of +# specified functions; etc, until the 5th. Then, the 6th argument will +# correspond to the following run of metrics, until the 10th; and so on. +# +# This test reads stdin and expects to find the output of one or more metrics +# runs, which it then reads line by line, parses the relevant numbers, +# and compares them to the expressions passed as arguments. + +echo "Checking libc metrics..." + +set -eu + +declare -A checks +runs=0 +cur_arg=0 +if [ $(($# % 5)) != 0 ]; then + echo "error: expected a multiple of 5 arguments, got $#" + exit 1 +fi +for ((run=1; run<=$(( ( $# ) / 5)); run++)) +do + for ((i=1;i<=5;i++)) + do + cur_arg=$((cur_arg+1)) + checks["${run}-$i"]="${!cur_arg}" + done + runs=$((runs+1)) +done + +regex=" *([a-zA-Z0-9\' -]+)+ +\(([0-9]+)\)" + +# tbl: stores mappings (<run>-<title>, <count>), where <run> is the +# metrics run (1 or 2), <title> is the Metrics title for the category, +# and <count> is the number between parentheses reported by Metrics. +declare -A tbl + +check () { # $1: state, $2: title, $3: expected cond + key="$1-$2" + count=${tbl[$key]-0} + test_exp='! [ $count $3 ]' + if eval $test_exp; then + echo "warning: [metrics run $1]: $2: expected $3, got $count" + fi +} + +# read stdin line by line and store relevant ones +# uses the '[metrics]' prefix to detect when a new run starts +state=0 +lines=0 +while IFS= read -r line; do + lines=$((lines+1)) + if [[ $line =~ "[metrics]" ]]; then + state=$((state + 1)) + fi + if [[ $line =~ $regex ]]; then + title="${BASH_REMATCH[1]}" + count=${BASH_REMATCH[2]} + tbl["$state-$title"]=$count + fi +done + +if [ "$state" == 0 ]; then + echo "error: no metrics output parsed." + exit 1 +fi + +# conditions to be checked + +for ((run=1; run<=$runs; run++)) +do + echo "Checking run $run..." + check $run "Defined functions" "${checks[$run-1]}" + check $run "Specified-only functions" "${checks[$run-2]}" + check $run "Undefined and unspecified functions" "${checks[$run-3]}" + check $run "'Extern' global variables" "${checks[$run-4]}" + check $run "Potential entry points" "${checks[$run-5]}" +done + +echo "Finished checking libc metrics." diff --git a/tests/libc/fc_libc.c b/tests/libc/fc_libc.c index 23ce1d6fe4b7b3497c76fcdd552788e964daeae5..c122ff2268ffa3f05bfb7a6677e4ca81e7b84ea2 100644 --- a/tests/libc/fc_libc.c +++ b/tests/libc/fc_libc.c @@ -1,7 +1,8 @@ /* run.config* PLUGIN: @EVA_PLUGINS@ metrics + EXECNOW: BIN @PTEST_NAME@.sav LOG @PTEST_NAME@_sav.res LOG @PTEST_NAME@_sav.err @frama-c@ -cpp-extra-args='-nostdinc -I@PTEST_SHARE_DIR@/libc' @PTEST_FILE@ -save @PTEST_NAME@.sav >@PTEST_NAME@_sav.res 2>@PTEST_NAME@_sav.err MODULE: check_libc_naming_conventions, check_const - OPT: -print -cpp-extra-args='-nostdinc -I@PTEST_SHARE_DIR@/libc' -metrics -metrics-libc -eva @EVA_CONFIG@ -then -lib-entry -no-print -metrics-no-libc + OPT: -load %{dep:@PTEST_NAME@.sav} -print -cpp-extra-args='-nostdinc -I@PTEST_SHARE_DIR@/libc' -eva @EVA_CONFIG@ -then -lib-entry -no-print MODULE: OPT: -print -print-libc -machdep x86_32 MODULE: check_parsing_individual_headers @@ -11,7 +12,8 @@ MODULE: check_compliance OPT: -kernel-msg-key printer:attrs MODULE: - CMD: %{dep:@PTEST_DIR@/check_full_libc.sh} @PTEST_SHARE_DIR@/libc + OPT: -load %{dep:@PTEST_NAME@.sav} -metrics -metrics-libc -then -lib-entry -metrics-no-libc | ./check_some_metrics.sh "> 100" "> 400" "< 2" "> 20" "= 1" "= 1" "= 0" "= 0" "= 0" "= 1" + CMD: %{dep:./check_full_libc.sh} @PTEST_SHARE_DIR@/libc OPT: **/ #define __FC_REG_TEST @@ -53,6 +55,7 @@ #include "__fc_define_intptr_t.h" #include "__fc_define_iovec.h" #include "__fc_define_key_t.h" +#include "__fc_define_locale_t.h" #include "__fc_define_max_open_files.h" #include "__fc_define_mode_t.h" #include "__fc_define_nlink_t.h" @@ -97,6 +100,7 @@ #include "ifaddrs.h" #include "inttypes.h" #include "iso646.h" +#include "langinfo.h" #include "libgen.h" #include "limits.h" #include "locale.h" @@ -125,6 +129,7 @@ #include "stdint.h" #include "stdio.h" #include "stdlib.h" +#include "stdnoreturn.h" #include "string.h" #include "strings.h" #include "stropts.h" diff --git a/tests/libc/oracle/coverage.res.oracle b/tests/libc/oracle/coverage.res.oracle index 65435f281364a42f1a5f53bc7d9fc4fcfde56014..8f5441c585c35ba31f4dca8d8208bea9bb4ae5db 100644 --- a/tests/libc/oracle/coverage.res.oracle +++ b/tests/libc/oracle/coverage.res.oracle @@ -28,7 +28,7 @@ main: 4 stmts out of 4 (100.0%) [metrics] Eva coverage statistics ======================= - Syntactically reachable functions = 2 (out of 114) + Syntactically reachable functions = 2 (out of 115) Semantically reached functions = 2 Coverage estimation = 100.0% [metrics] Statements analyzed by Eva diff --git a/tests/libc/oracle/fc_libc.0.res.oracle b/tests/libc/oracle/fc_libc.0.res.oracle index 946e4913da2a899e027877ced620e96ebdca02d5..96ad940d69778adf1aee7a90d46c4d25b63c46c2 100644 --- a/tests/libc/oracle/fc_libc.0.res.oracle +++ b/tests/libc/oracle/fc_libc.0.res.oracle @@ -1,230 +1,19 @@ +[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. [kernel] Parsing fc_libc.c (with preprocessing) [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed [eva:initial-state] Values of globals at initialization -[eva] fc_libc.c:167: assertion got status valid. -[eva] fc_libc.c:168: assertion got status valid. -[eva] fc_libc.c:169: assertion got status valid. -[eva] fc_libc.c:170: assertion got status valid. +[eva] fc_libc.c:172: assertion got status valid. +[eva] fc_libc.c:173: assertion got status valid. +[eva] fc_libc.c:174: assertion got status valid. +[eva] fc_libc.c:175: assertion got status valid. [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== [eva:final-states] Values at end of function main: -[metrics] Defined functions (128) - ======================= - Frama_C_abort (1 call); Frama_C_char_interval (1 call); - Frama_C_double_interval (0 call); Frama_C_float_interval (0 call); - Frama_C_interval (17 calls); Frama_C_make_unknown (6 calls); - Frama_C_nondet (13 calls); Frama_C_nondet_ptr (0 call); - Frama_C_update_entropy (7 calls); __FC_assert (7 calls); - __fc_atomic_compare_exchange_strong (3 calls); - __fc_atomic_compare_exchange_strong_explicit (0 call); - __fc_atomic_compare_exchange_weak (0 call); - __fc_atomic_compare_exchange_weak_explicit (0 call); - __fc_atomic_exchange (1 call); __fc_atomic_exchange_explicit (0 call); - __fc_atomic_fetch_add (1 call); __fc_atomic_fetch_add_explicit (0 call); - __fc_atomic_fetch_and (1 call); __fc_atomic_fetch_and_explicit (0 call); - __fc_atomic_fetch_or (1 call); __fc_atomic_fetch_or_explicit (0 call); - __fc_atomic_fetch_sub (1 call); __fc_atomic_fetch_sub_explicit (0 call); - __fc_atomic_fetch_xor (1 call); __fc_atomic_fetch_xor_explicit (0 call); - __fc_atomic_init_marker (0 call); __fc_atomic_is_lock_free (0 call); - __fc_atomic_load (1 call); __fc_atomic_load_explicit (0 call); - __fc_atomic_store_explicit_marker (0 call); - __fc_atomic_store_marker (0 call); __fc_initenv (4 calls); - __finite (0 call); __finitef (0 call); abs (0 call); argz_add (3 calls); - argz_add_sep (0 call); argz_append (2 calls); argz_count (0 call); - argz_create (0 call); argz_create_sep (0 call); argz_delete (0 call); - argz_extract (0 call); argz_insert (0 call); argz_next (1 call); - argz_replace (0 call); argz_stringify (0 call); asprintf (0 call); - atoi (0 call); atomic_flag_clear (0 call); - atomic_flag_clear_explicit (0 call); atomic_flag_test_and_set (0 call); - atomic_flag_test_and_set_explicit (0 call); atomic_signal_fence (0 call); - atomic_thread_fence (0 call); calloc (0 call); - char_equal_ignore_case (1 call); fabs (0 call); fabsf (0 call); - feholdexcept (0 call); fesetenv (0 call); fetestexcept (0 call); - getaddrinfo (0 call); getenv (0 call); gethostbyname (0 call); - getline (0 call); glob (0 call); globfree (0 call); imaxabs (0 call); - imaxdiv (0 call); isalnum (0 call); isalpha (0 call); isblank (0 call); - iscntrl (0 call); isdigit (3 calls); isgraph (0 call); islower (0 call); - isprint (0 call); ispunct (0 call); isspace (1 call); isupper (0 call); - isxdigit (0 call); localeconv (0 call); main (0 call); memchr (0 call); - memcmp (1 call); memcpy (7 calls); memmove (3 calls); memoverlap (1 call); - mempcpy (1 call); memrchr (0 call); memset (1 call); - posix_memalign (0 call); putenv (0 call); realpath (0 call); - res_search (1 call); setenv (0 call); setlocale (0 call); stpcpy (1 call); - str_append (3 calls); strcasecmp (0 call); strcat (0 call); - strchr (4 calls); strcmp (0 call); strcpy (1 call); strdup (0 call); - strerror (0 call); strlen (17 calls); strncat (0 call); strncmp (0 call); - strncpy (2 calls); strndup (1 call); strnlen (1 call); strrchr (0 call); - strsignal (0 call); strstr (2 calls); tolower (0 call); toupper (0 call); - unsetenv (0 call); wcscat (0 call); wcscpy (0 call); wcsdup (0 call); - wcslen (3 calls); wcsncat (0 call); wcsncpy (0 call); wmemcpy (1 call); - wmemset (0 call); - - Specified-only functions (427) - ============================== - FD_CLR (0 call); FD_ISSET (0 call); FD_SET (0 call); FD_ZERO (0 call); - Frama_C_int_interval (0 call); Frama_C_long_interval (0 call); - Frama_C_long_long_interval (0 call); - Frama_C_real_interval_as_double (0 call); Frama_C_short_interval (0 call); - Frama_C_size_t_interval (0 call); Frama_C_unsigned_char_interval (0 call); - Frama_C_unsigned_int_interval (0 call); - Frama_C_unsigned_long_interval (0 call); - Frama_C_unsigned_long_long_interval (0 call); - Frama_C_unsigned_short_interval (0 call); _Exit (0 call); - __builtin_clz (0 call); __builtin_clzl (0 call); __builtin_clzll (0 call); - __builtin_ctz (0 call); __builtin_ctzl (0 call); __builtin_ctzll (0 call); - __builtin_popcount (0 call); __builtin_popcountl (0 call); - __builtin_popcountll (0 call); __builtin_sadd_overflow (0 call); - __builtin_saddl_overflow (0 call); __builtin_saddll_overflow (0 call); - __builtin_smul_overflow (0 call); __builtin_smull_overflow (0 call); - __builtin_smulll_overflow (0 call); __builtin_ssub_overflow (0 call); - __builtin_ssubl_overflow (0 call); __builtin_ssubll_overflow (0 call); - __builtin_uadd_overflow (0 call); __builtin_uaddl_overflow (0 call); - __builtin_uaddll_overflow (0 call); __builtin_umul_overflow (0 call); - __builtin_umull_overflow (0 call); __builtin_umulll_overflow (0 call); - __builtin_usub_overflow (0 call); __builtin_usubl_overflow (0 call); - __builtin_usubll_overflow (0 call); __fc_fpclassify (0 call); - __fc_fpclassifyf (0 call); __fc_infinity (0 call); __fc_nan (0 call); - __va_fcntl_flock (0 call); __va_fcntl_int (0 call); - __va_fcntl_void (0 call); __va_ioctl_int (0 call); __va_ioctl_ptr (0 call); - __va_ioctl_void (0 call); __va_open_mode_t (0 call); - __va_open_void (0 call); __va_openat_mode_t (0 call); - __va_openat_void (0 call); _exit (0 call); abort (0 call); accept (0 call); - access (0 call); acos (0 call); acosf (0 call); acosh (0 call); - acoshf (0 call); acoshl (0 call); acosl (0 call); alloca (0 call); - asctime (0 call); asin (0 call); asinf (0 call); asinl (0 call); - at_quick_exit (0 call); atan (0 call); atan2 (0 call); atan2f (0 call); - atan2l (0 call); atanf (0 call); atanl (0 call); atexit (0 call); - atof (0 call); atol (0 call); atoll (0 call); basename (0 call); - bind (0 call); bsearch (0 call); bzero (0 call); ceil (0 call); - ceilf (0 call); ceill (0 call); cfgetispeed (0 call); cfgetospeed (0 call); - cfsetispeed (0 call); cfsetospeed (0 call); chdir (0 call); chown (0 call); - chroot (0 call); clearerr (0 call); clearerr_unlocked (0 call); - clock (0 call); clock_gettime (0 call); clock_nanosleep (0 call); - close (0 call); closedir (0 call); closelog (0 call); connect (0 call); - cos (0 call); cosf (0 call); cosl (0 call); creat (0 call); ctime (0 call); - difftime (0 call); dirname (0 call); div (0 call); drand48 (0 call); - dup (0 call); dup2 (0 call); erand48 (0 call); execl (0 call); - execle (0 call); execlp (0 call); execv (0 call); execve (0 call); - execvp (0 call); exit (0 call); exp (0 call); expf (0 call); fabsl (0 call); - fclose (0 call); fcntl (0 call); fdopen (0 call); feof (2 calls); - feof_unlocked (0 call); ferror (2 calls); ferror_unlocked (0 call); - fflush (0 call); fgetc (1 call); fgetpos (0 call); fgets (0 call); - fgetws (0 call); fileno (0 call); fileno_unlocked (0 call); flock (0 call); - flockfile (0 call); floor (0 call); floorf (0 call); floorl (0 call); - fmod (0 call); fmodf (0 call); fopen (0 call); fork (0 call); - fputc (0 call); fputs (0 call); fread (0 call); free (7 calls); - freeaddrinfo (0 call); freopen (0 call); frexp (0 call); frexpf (0 call); - frexpl (0 call); fseek (0 call); fseeko (0 call); fsetpos (0 call); - ftell (0 call); ftello (0 call); ftrylockfile (0 call); - funlockfile (0 call); fwrite (0 call); gai_strerror (0 call); getc (0 call); - getc_unlocked (0 call); getchar (0 call); getchar_unlocked (0 call); - getcwd (0 call); getegid (0 call); geteuid (0 call); getgid (0 call); - gethostname (0 call); getitimer (0 call); getopt (0 call); - getopt_long (0 call); getopt_long_only (0 call); getpgid (0 call); - getpgrp (0 call); getpid (0 call); getppid (0 call); getpriority (0 call); - getpwnam (0 call); getpwuid (0 call); getresgid (0 call); - getresuid (0 call); getrlimit (0 call); getrusage (0 call); gets (0 call); - getsid (0 call); getsockname (0 call); getsockopt (0 call); - gettimeofday (0 call); getuid (0 call); gmtime (0 call); gmtime_r (0 call); - htonl (0 call); htons (0 call); iconv (0 call); iconv_close (0 call); - iconv_open (0 call); inet_addr (2 calls); inet_ntoa (0 call); - inet_ntop (0 call); inet_pton (0 call); isascii (0 call); isatty (0 call); - jrand48 (0 call); kill (0 call); killpg (0 call); labs (0 call); - lcong48 (0 call); ldexp (0 call); ldexpf (0 call); ldiv (0 call); - listen (0 call); llabs (0 call); lldiv (0 call); localtime (0 call); - log (0 call); log10 (0 call); log10f (0 call); log10l (0 call); - log2 (0 call); log2f (0 call); log2l (0 call); logf (0 call); logl (0 call); - longjmp (0 call); lrand48 (0 call); lseek (0 call); lstat (0 call); - makedev (0 call); malloc (13 calls); mblen (0 call); mbstowcs (0 call); - mbtowc (0 call); mkdir (0 call); mkfifo (0 call); mknod (0 call); - mkstemp (0 call); mktime (0 call); mrand48 (0 call); nan (0 call); - nanf (0 call); nanl (0 call); nanosleep (0 call); nrand48 (0 call); - ntohl (0 call); ntohs (0 call); open (0 call); openat (0 call); - opendir (0 call); openlog (0 call); pathconf (0 call); pclose (0 call); - perror (0 call); pipe (0 call); poll (0 call); popen (0 call); pow (0 call); - powf (0 call); pthread_cond_broadcast (0 call); - pthread_cond_destroy (0 call); pthread_cond_init (0 call); - pthread_cond_wait (0 call); pthread_create (0 call); - pthread_getname_np (0 call); pthread_join (0 call); - pthread_mutex_destroy (0 call); pthread_mutex_init (0 call); - pthread_mutex_lock (0 call); pthread_mutex_unlock (0 call); - pthread_mutexattr_destroy (0 call); pthread_mutexattr_init (0 call); - pthread_mutexattr_settype (0 call); pthread_setname_np (0 call); - putc (0 call); putc_unlocked (0 call); putchar (0 call); - putchar_unlocked (0 call); puts (0 call); qsort (0 call); - quick_exit (0 call); raise (0 call); rand (0 call); random (0 call); - read (0 call); readdir (0 call); readv (0 call); realloc (7 calls); - recv (0 call); recvfrom (0 call); recvmsg (0 call); remove (0 call); - rename (0 call); rewind (0 call); round (0 call); roundf (0 call); - roundl (0 call); seed48 (0 call); select (0 call); send (0 call); - sendfile (0 call); sendto (0 call); setbuf (0 call); setegid (0 call); - seteuid (0 call); setgid (0 call); sethostname (0 call); setitimer (0 call); - setjmp (0 call); setlogmask (0 call); setpgid (0 call); - setpriority (0 call); setregid (0 call); setresgid (0 call); - setresuid (0 call); setreuid (0 call); setrlimit (0 call); setsid (0 call); - setsockopt (0 call); settimeofday (0 call); setuid (0 call); - setvbuf (0 call); shutdown (0 call); sigaction (0 call); sigaddset (0 call); - sigdelset (0 call); sigemptyset (0 call); sigfillset (0 call); - sigismember (0 call); siglongjmp (0 call); signal (0 call); - sigprocmask (0 call); sin (0 call); sinf (0 call); sinl (0 call); - sleep (0 call); socket (0 call); socketpair (0 call); sqrt (0 call); - sqrtf (0 call); sqrtl (0 call); srand (0 call); srand48 (0 call); - srandom (0 call); stat (0 call); strcasestr (0 call); strchrnul (0 call); - strcoll (0 call); strcspn (0 call); strftime (0 call); strlcat (0 call); - strlcpy (0 call); strncasecmp (0 call); strpbrk (0 call); strsep (0 call); - strspn (0 call); strtod (0 call); strtof (0 call); strtoimax (0 call); - strtok (0 call); strtok_r (0 call); strtol (0 call); strtold (0 call); - strtoll (0 call); strtoul (0 call); strtoull (0 call); strxfrm (0 call); - sync (0 call); sysconf (0 call); syslog (0 call); system (0 call); - tan (0 call); tanf (0 call); tanl (0 call); tcflush (0 call); - tcgetattr (0 call); tcsetattr (0 call); time (0 call); times (0 call); - tmpfile (0 call); tmpnam (0 call); trunc (0 call); truncf (0 call); - truncl (0 call); ttyname (0 call); tzset (0 call); umask (0 call); - uname (0 call); ungetc (0 call); unlink (0 call); usleep (0 call); - utimes (0 call); vfprintf (0 call); vfscanf (0 call); vprintf (0 call); - vscanf (0 call); vsnprintf (0 call); vsprintf (0 call); vsyslog (0 call); - wait (0 call); waitpid (0 call); wcscasecmp (0 call); wcschr (0 call); - wcscmp (0 call); wcscspn (0 call); wcslcat (0 call); wcslcpy (0 call); - wcsncmp (0 call); wcspbrk (0 call); wcsrchr (0 call); wcsspn (0 call); - wcsstr (0 call); wcstombs (0 call); wctomb (0 call); wmemchr (0 call); - wmemcmp (0 call); wmemmove (0 call); write (0 call); writev (0 call); - - Undefined and unspecified functions (1) - ======================================= - __builtin_abort (1 call); - - 'Extern' global variables (22) - ============================== - __fc_basename; __fc_dirname; __fc_fds; __fc_getpwuid_pw_dir; - __fc_getpwuid_pw_name; __fc_getpwuid_pw_passwd; __fc_getpwuid_pw_shell; - __fc_heap_status; __fc_hostname; __fc_locale; __fc_locale_names; - __fc_mblen_state; __fc_mbtowc_state; __fc_random_counter; - __fc_socket_counter; __fc_stack_status; __fc_tz; __fc_wctomb_state; optarg; - opterr; optopt; tzname - - Potential entry points (1) - ========================== - main; - - Global metrics - ============== - Sloc = 1647 - Decision point = 307 - Global variables = 86 - If = 292 - Loop = 55 - Goto = 118 - Assignment = 717 - Exit point = 128 - Function = 556 - Function call = 165 - Pointer dereferencing = 350 - Cyclomatic complexity = 435 [kernel] FRAMAC_SHARE/libc/sys/socket.h:451: Warning: clause with '\initialized' must contain name 'initialization' /* Generated by Frama-C */ @@ -321,37 +110,3 @@ void main(void) [eva] ====== VALUES COMPUTED ====== [eva:final-states] Values at end of function main: -[metrics] Defined functions (1) - ===================== - main (0 call); - - Specified-only functions (0) - ============================ - - - Undefined and unspecified functions (0) - ======================================= - - - 'Extern' global variables (0) - ============================= - - - Potential entry points (1) - ========================== - main; - - Global metrics - ============== - Sloc = 5 - Decision point = 0 - Global variables = 0 - If = 0 - Loop = 0 - Goto = 0 - Assignment = 0 - Exit point = 1 - Function = 1 - Function call = 0 - Pointer dereferencing = 0 - Cyclomatic complexity = 1 diff --git a/tests/libc/oracle/fc_libc.1.res.oracle b/tests/libc/oracle/fc_libc.1.res.oracle index b5f06ccc75be5ebb84b9d3bcd50242b02460dd9f..566c5af75a06db659d7b28cacb1c2f2a69a9640d 100644 --- a/tests/libc/oracle/fc_libc.1.res.oracle +++ b/tests/libc/oracle/fc_libc.1.res.oracle @@ -1620,6 +1620,7 @@ extern size_t wcstombs(char * restrict s, wchar_t const * restrict pwcs, int posix_memalign(void **memptr, size_t alignment, size_t size); /*@ requires valid_template: valid_string(templat); + requires template_len: strlen(templat) ≥ 6; ensures result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16); assigns *(templat + (0 ..)), \result; @@ -1628,8 +1629,21 @@ int posix_memalign(void **memptr, size_t alignment, size_t size); */ extern int mkstemp(char *templat); +/*@ requires valid_template: valid_string(templat); + requires template_len: strlen(templat) ≥ 6 + suffixlen; + requires non_negative_suffixlen: suffixlen ≥ 0; + ensures + result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16); + assigns *(templat + (0 ..)), \result; + assigns *(templat + (0 ..)) \from \nothing; + assigns \result \from \nothing; + */ +extern int mkstemps(char *templat, int suffixlen); + char *realpath(char const * restrict file_name, char * restrict resolved_name); +char *canonicalize_file_name(char const *path); + /*@ predicate non_escaping{L}(void *s, ℤ n) = ∀ ℤ i; 0 ≤ i < n ⇒ ¬\dangling((char *)s + i); @@ -5284,6 +5298,8 @@ extern struct tm *gmtime(time_t const *timer); ensures result_null_or_internal_tm: \result ≡ &__fc_time_tm ∨ \result ≡ \null; + ensures + maybe_error: __fc_errno ≡ \old(__fc_errno) ∨ __fc_errno ≡ 75; assigns \result, __fc_time_tm; assigns \result \from __fc_p_time_tm; assigns __fc_time_tm \from *timer; @@ -5438,6 +5454,22 @@ extern int clock_nanosleep(clockid_t clock_id, int flags, extern struct tm *gmtime_r(time_t const * restrict timer, struct tm * restrict result); +/*@ requires valid_timer: \valid_read(timep); + requires valid_result: \valid(result); + ensures + result_null_or_initialized: initialization: + (\result ≡ \old(result) ∧ \initialized(\old(result))) ∨ + \result ≡ \null; + ensures + maybe_error: __fc_errno ≡ \old(__fc_errno) ∨ __fc_errno ≡ 75; + assigns \result, *result, __fc_errno; + assigns \result \from (indirect: *timep), result; + assigns *result \from (indirect: *timep); + assigns __fc_errno \from (indirect: *timep); + */ +extern struct tm *localtime_r(time_t const * restrict timep, + struct tm * restrict result); + /*@ requires valid_request: \valid_read(rqtp); requires initialization: initialized_request: @@ -6698,10 +6730,6 @@ ssize_t getline(char **lineptr, size_t *n, FILE *stream); int asprintf(char **strp, char const *fmt, void * const *__va_params); -/*@ assigns \result; - assigns \result \from maj, min; */ -extern dev_t makedev(int maj, int min); - FILE __fc_initial_stdout = {.__fc_FILE_id = (unsigned int)1, .__fc_FILE_data = 0U}; FILE *__fc_stdout = & __fc_initial_stdout; @@ -7222,6 +7250,13 @@ char *realpath(char const * restrict file_name, char * restrict resolved_name) return_label: return __retres; } +char *canonicalize_file_name(char const *path) +{ + char *tmp; + tmp = realpath(path,(char *)0); + return tmp; +} + /*@ requires valid_dest: valid_or_empty(dest, n); requires valid_src: valid_read_or_empty(src, n); requires @@ -8691,6 +8726,9 @@ int __builtin_popcountl(unsigned long x); */ int __builtin_popcountll(unsigned long long x); +/*@ assigns \nothing; */ +void __sync_synchronize(void); + /*@ logic 𔹠bit_test(ℤ x, ℤ pos) = (x & (1 << pos)) ≢ 0; */ diff --git a/tests/libc/oracle/fc_libc.2.res.oracle b/tests/libc/oracle/fc_libc.2.res.oracle index 58fab9624e5211f9e3545690c86120ab90421e36..9e97d67741a1d5aa5687dc28730ad2aa41f27b7b 100644 --- a/tests/libc/oracle/fc_libc.2.res.oracle +++ b/tests/libc/oracle/fc_libc.2.res.oracle @@ -15,6 +15,7 @@ [kernel] Parsing FRAMAC_SHARE/libc/__fc_define_intptr_t.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/__fc_define_iovec.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/__fc_define_key_t.h (with preprocessing) +[kernel] Parsing FRAMAC_SHARE/libc/__fc_define_locale_t.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/__fc_define_max_open_files.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/__fc_define_mode_t.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/__fc_define_nlink_t.h (with preprocessing) @@ -70,6 +71,7 @@ skipping FRAMAC_SHARE/libc/complex.h [kernel] Parsing FRAMAC_SHARE/libc/ifaddrs.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/inttypes.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/iso646.h (with preprocessing) +[kernel] Parsing FRAMAC_SHARE/libc/langinfo.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/libgen.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/limits.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/locale.h (with preprocessing) @@ -98,6 +100,7 @@ skipping FRAMAC_SHARE/libc/complex.h [kernel] Parsing FRAMAC_SHARE/libc/stdint.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/stdio.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/stdlib.h (with preprocessing) +[kernel] Parsing FRAMAC_SHARE/libc/stdnoreturn.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/string.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/strings.h (with preprocessing) [kernel] Parsing FRAMAC_SHARE/libc/stropts.h (with preprocessing) diff --git a/tests/libc/oracle/fc_libc.5.res.oracle b/tests/libc/oracle/fc_libc.5.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..bd056d31184ac4aa368a84cd783a7e683415b455 --- /dev/null +++ b/tests/libc/oracle/fc_libc.5.res.oracle @@ -0,0 +1,4 @@ +Checking libc metrics... +Checking run 1... +Checking run 2... +Finished checking libc metrics. diff --git a/tests/libc/oracle/fc_libc_sav.err b/tests/libc/oracle/fc_libc_sav.err new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/libc/oracle/fc_libc_sav.res b/tests/libc/oracle/fc_libc_sav.res new file mode 100644 index 0000000000000000000000000000000000000000..6bfe1d501b92186f4b4283d9c3e9202294c1e834 --- /dev/null +++ b/tests/libc/oracle/fc_libc_sav.res @@ -0,0 +1 @@ +[kernel] Parsing fc_libc.c (with preprocessing) diff --git a/tests/libc/oracle/stdlib_c.0.res.oracle b/tests/libc/oracle/stdlib_c.0.res.oracle index 455e3224fdcdbca6d7a56e1c485c104266d6804e..de5dc645871557d472e178e5336116a5d5d47305 100644 --- a/tests/libc/oracle/stdlib_c.0.res.oracle +++ b/tests/libc/oracle/stdlib_c.0.res.oracle @@ -191,6 +191,58 @@ [eva] Done for function Frama_C_make_unknown [eva] Recording results for realpath [eva] Done for function realpath +[eva] computing for function canonicalize_file_name <- main. + Called from stdlib_c.c:56. +[eva] computing for function realpath <- canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:236. +[eva] computing for function Frama_C_interval <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:213. +[eva] Done for function Frama_C_interval +[eva] computing for function Frama_C_interval <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:222. +[eva] Done for function Frama_C_interval +[eva] FRAMAC_SHARE/libc/stdlib.c:224: Call to builtin Frama_C_malloc +[eva] FRAMAC_SHARE/libc/stdlib.c:224: + allocating variable __malloc_realpath_l224_0 +[eva] computing for function Frama_C_make_unknown <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:230. +[eva] Done for function Frama_C_make_unknown +[eva] Recording results for realpath +[eva] Done for function realpath +[eva] Recording results for canonicalize_file_name +[eva] Done for function canonicalize_file_name +[eva] computing for function canonicalize_file_name <- main. + Called from stdlib_c.c:56. +[eva] computing for function realpath <- canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:236. +[eva] computing for function Frama_C_interval <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:213. +[eva] Done for function Frama_C_interval +[eva] computing for function Frama_C_interval <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:222. +[eva] Done for function Frama_C_interval +[eva] FRAMAC_SHARE/libc/stdlib.c:224: Call to builtin Frama_C_malloc +[eva] computing for function Frama_C_make_unknown <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:230. +[eva] Done for function Frama_C_make_unknown +[eva] Recording results for realpath +[eva] Done for function realpath +[eva] Recording results for canonicalize_file_name +[eva] Done for function canonicalize_file_name +[eva] computing for function free <- main. + Called from stdlib_c.c:57. +[eva] stdlib_c.c:57: Warning: ignoring unsupported \allocates clause +[eva] stdlib_c.c:57: function free: precondition 'freeable' got status valid. +[eva] Done for function free +[eva] computing for function free <- main. + Called from stdlib_c.c:57. +[eva] Done for function free [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== @@ -204,14 +256,23 @@ Frama_C_entropy_source ∈ [--..--] __fc_errno ∈ [--..--] resolved_name ∈ - {{ NULL ; &__malloc_main_l44[0] ; - &__malloc_realpath_l224[0] }} + {{ NULL ; &__malloc_main_l44[0] ; &__malloc_realpath_l224[0] ; + &__malloc_realpath_l224_0[0] }} realpath_len ∈ [1..256] __retres ∈ - {{ NULL ; &__malloc_main_l44[0] ; &__malloc_realpath_l224[0] }} + {{ NULL ; &__malloc_main_l44[0] ; &__malloc_realpath_l224[0] ; + &__malloc_realpath_l224_0[0] }} __malloc_main_l44[0..255] ∈ [--..--] or UNINITIALIZED __malloc_realpath_l224[0] ∈ [--..--] [1..255] ∈ [--..--] or UNINITIALIZED + __malloc_realpath_l224_0[0] ∈ [--..--] + [1..255] ∈ [--..--] or UNINITIALIZED +[eva:final-states] Values at end of function canonicalize_file_name: + __fc_heap_status ∈ [--..--] + Frama_C_entropy_source ∈ [--..--] + __fc_errno ∈ [--..--] + __malloc_realpath_l224_0[0] ∈ [--..--] + [1..255] ∈ [--..--] or UNINITIALIZED [eva:final-states] Values at end of function main: __fc_heap_status ∈ [--..--] Frama_C_entropy_source ∈ [--..--] @@ -227,8 +288,11 @@ p_memal_res2 ∈ {0; 12} resolved_name ∈ {{ NULL ; &__malloc_main_l44[0] }} realpath_res ∈ {{ NULL ; &__malloc_realpath_l224[0] }} + canon ∈ {{ NULL ; &__malloc_realpath_l224_0[0] }} __retres ∈ {0; 1} __calloc_w_main_l33[0..1073741823] ∈ {0; 42} __malloc_main_l44[0..255] ∈ [--..--] or UNINITIALIZED __malloc_realpath_l224[0] ∈ [--..--] [1..255] ∈ [--..--] or UNINITIALIZED + __malloc_realpath_l224_0[0] ∈ [--..--] + [1..255] ∈ [--..--] or UNINITIALIZED diff --git a/tests/libc/oracle/stdlib_c.1.res.oracle b/tests/libc/oracle/stdlib_c.1.res.oracle index 6591da2a4ba55bff3530364588638f54f4dae4d4..989193e4adde5c3bcb87e206fa2249a041be1f47 100644 --- a/tests/libc/oracle/stdlib_c.1.res.oracle +++ b/tests/libc/oracle/stdlib_c.1.res.oracle @@ -207,6 +207,58 @@ [eva] Done for function Frama_C_make_unknown [eva] Recording results for realpath [eva] Done for function realpath +[eva] computing for function canonicalize_file_name <- main. + Called from stdlib_c.c:56. +[eva] computing for function realpath <- canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:236. +[eva] computing for function Frama_C_interval <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:213. +[eva] Done for function Frama_C_interval +[eva] computing for function Frama_C_interval <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:222. +[eva] Done for function Frama_C_interval +[eva] FRAMAC_SHARE/libc/stdlib.c:224: Call to builtin Frama_C_malloc +[eva] FRAMAC_SHARE/libc/stdlib.c:224: + allocating variable __malloc_realpath_l224_0 +[eva] computing for function Frama_C_make_unknown <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:230. +[eva] Done for function Frama_C_make_unknown +[eva] Recording results for realpath +[eva] Done for function realpath +[eva] Recording results for canonicalize_file_name +[eva] Done for function canonicalize_file_name +[eva] computing for function canonicalize_file_name <- main. + Called from stdlib_c.c:56. +[eva] computing for function realpath <- canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:236. +[eva] computing for function Frama_C_interval <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:213. +[eva] Done for function Frama_C_interval +[eva] computing for function Frama_C_interval <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:222. +[eva] Done for function Frama_C_interval +[eva] FRAMAC_SHARE/libc/stdlib.c:224: Call to builtin Frama_C_malloc +[eva] computing for function Frama_C_make_unknown <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:230. +[eva] Done for function Frama_C_make_unknown +[eva] Recording results for realpath +[eva] Done for function realpath +[eva] Recording results for canonicalize_file_name +[eva] Done for function canonicalize_file_name +[eva] computing for function free <- main. + Called from stdlib_c.c:57. +[eva] stdlib_c.c:57: Warning: ignoring unsupported \allocates clause +[eva] stdlib_c.c:57: function free: precondition 'freeable' got status valid. +[eva] Done for function free +[eva] computing for function free <- main. + Called from stdlib_c.c:57. +[eva] Done for function free [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== @@ -220,14 +272,23 @@ Frama_C_entropy_source ∈ [--..--] __fc_errno ∈ [--..--] resolved_name ∈ - {{ NULL ; &__malloc_main_l44[0] ; - &__malloc_realpath_l224[0] }} + {{ NULL ; &__malloc_main_l44[0] ; &__malloc_realpath_l224[0] ; + &__malloc_realpath_l224_0[0] }} realpath_len ∈ [1..256] __retres ∈ - {{ NULL ; &__malloc_main_l44[0] ; &__malloc_realpath_l224[0] }} + {{ NULL ; &__malloc_main_l44[0] ; &__malloc_realpath_l224[0] ; + &__malloc_realpath_l224_0[0] }} __malloc_main_l44[0..255] ∈ [--..--] or UNINITIALIZED __malloc_realpath_l224[0] ∈ [--..--] [1..255] ∈ [--..--] or UNINITIALIZED + __malloc_realpath_l224_0[0] ∈ [--..--] + [1..255] ∈ [--..--] or UNINITIALIZED +[eva:final-states] Values at end of function canonicalize_file_name: + __fc_heap_status ∈ [--..--] + Frama_C_entropy_source ∈ [--..--] + __fc_errno ∈ [--..--] + __malloc_realpath_l224_0[0] ∈ [--..--] + [1..255] ∈ [--..--] or UNINITIALIZED [eva:final-states] Values at end of function main: __fc_heap_status ∈ [--..--] Frama_C_entropy_source ∈ [--..--] @@ -243,8 +304,11 @@ p_memal_res2 ∈ {0} resolved_name ∈ {{ &__malloc_main_l44[0] }} realpath_res ∈ {{ NULL ; &__malloc_realpath_l224[0] }} + canon ∈ {{ NULL ; &__malloc_realpath_l224_0[0] }} __retres ∈ {0} __calloc_w_main_l33[0..1073741823] ∈ {0; 42} __malloc_main_l44[0..255] ∈ [--..--] or UNINITIALIZED __malloc_realpath_l224[0] ∈ [--..--] [1..255] ∈ [--..--] or UNINITIALIZED + __malloc_realpath_l224_0[0] ∈ [--..--] + [1..255] ∈ [--..--] or UNINITIALIZED diff --git a/tests/libc/oracle/stdlib_c.2.res.oracle b/tests/libc/oracle/stdlib_c.2.res.oracle index 01861ff92b210e6a56013802b3f39aa96076880d..38d0c05207233c440dcf4b0908f70da89082c1b1 100644 --- a/tests/libc/oracle/stdlib_c.2.res.oracle +++ b/tests/libc/oracle/stdlib_c.2.res.oracle @@ -172,6 +172,34 @@ [eva] Done for function Frama_C_make_unknown [eva] Recording results for realpath [eva] Done for function realpath +[eva] computing for function canonicalize_file_name <- main. + Called from stdlib_c.c:56. +[eva] computing for function realpath <- canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:236. +[eva] computing for function Frama_C_interval <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:213. +[eva] Done for function Frama_C_interval +[eva] computing for function Frama_C_interval <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:222. +[eva] Done for function Frama_C_interval +[eva] FRAMAC_SHARE/libc/stdlib.c:224: Call to builtin Frama_C_malloc +[eva] FRAMAC_SHARE/libc/stdlib.c:224: + allocating variable __malloc_realpath_l224_0 +[eva] computing for function Frama_C_make_unknown <- realpath <- + canonicalize_file_name <- main. + Called from FRAMAC_SHARE/libc/stdlib.c:230. +[eva] Done for function Frama_C_make_unknown +[eva] Recording results for realpath +[eva] Done for function realpath +[eva] Recording results for canonicalize_file_name +[eva] Done for function canonicalize_file_name +[eva] computing for function free <- main. + Called from stdlib_c.c:57. +[eva] stdlib_c.c:57: Warning: ignoring unsupported \allocates clause +[eva] stdlib_c.c:57: function free: precondition 'freeable' got status valid. +[eva] Done for function free [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== @@ -198,13 +226,20 @@ Frama_C_entropy_source ∈ [--..--] __fc_errno ∈ [--..--] resolved_name ∈ - {{ NULL ; &__malloc_main_l44[0] ; - &__malloc_realpath_l224[0] }} + {{ NULL ; &__malloc_main_l44[0] ; &__malloc_realpath_l224[0] ; + &__malloc_realpath_l224_0[0] }} realpath_len ∈ [1..256] __retres ∈ - {{ NULL ; &__malloc_main_l44[0] ; &__malloc_realpath_l224[0] }} + {{ NULL ; &__malloc_main_l44[0] ; &__malloc_realpath_l224[0] ; + &__malloc_realpath_l224_0[0] }} __malloc_main_l44[0..255] ∈ [--..--] or UNINITIALIZED __malloc_realpath_l224[0..255] ∈ [--..--] or UNINITIALIZED + __malloc_realpath_l224_0[0..255] ∈ [--..--] or UNINITIALIZED +[eva:final-states] Values at end of function canonicalize_file_name: + __fc_heap_status ∈ [--..--] + Frama_C_entropy_source ∈ [--..--] + __fc_errno ∈ [--..--] + __malloc_realpath_l224_0[0..255] ∈ [--..--] or UNINITIALIZED [eva:final-states] Values at end of function main: __fc_heap_status ∈ [--..--] Frama_C_entropy_source ∈ [--..--] @@ -220,9 +255,11 @@ p_memal_res2 ∈ {0; 12} resolved_name ∈ {{ NULL ; &__malloc_main_l44[0] }} realpath_res ∈ {{ NULL ; &__malloc_realpath_l224[0] }} + canon ∈ {{ NULL ; &__malloc_realpath_l224_0[0] }} __retres ∈ {0; 1} __malloc_calloc_l72[0..3] ∈ [--..--] or UNINITIALIZED __malloc_calloc_l72_0[0..4294967291] ∈ [--..--] or UNINITIALIZED __malloc_w_calloc_l72_1[0..4294967291] ∈ [--..--] or UNINITIALIZED __malloc_main_l44[0..255] ∈ [--..--] or UNINITIALIZED __malloc_realpath_l224[0..255] ∈ [--..--] or UNINITIALIZED + __malloc_realpath_l224_0[0..255] ∈ [--..--] or UNINITIALIZED diff --git a/tests/libc/oracle/stdlib_h.res.oracle b/tests/libc/oracle/stdlib_h.res.oracle index 76a413c1aadb053057116a31d643294b3c8fd6c3..158e8ba4bdca33b8329f5d2080b2620a98693034 100644 --- a/tests/libc/oracle/stdlib_h.res.oracle +++ b/tests/libc/oracle/stdlib_h.res.oracle @@ -237,6 +237,8 @@ [eva] using specification for function mkstemp [eva] stdlib_h.c:82: function mkstemp: precondition 'valid_template' got status valid. +[eva] stdlib_h.c:82: + function mkstemp: precondition 'template_len' got status valid. [eva] Done for function mkstemp [eva] computing for function drand48 <- main. Called from stdlib_h.c:86. diff --git a/tests/libc/oracle/stdnoreturn_h.res.oracle b/tests/libc/oracle/stdnoreturn_h.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..f5fbba713d56de675b475d752e49b649f35f4f5d --- /dev/null +++ b/tests/libc/oracle/stdnoreturn_h.res.oracle @@ -0,0 +1,23 @@ +[kernel] Parsing stdnoreturn_h.c (with preprocessing) +[eva] Analyzing a complete application starting at main +[eva] Computing initial state +[eva] Initial state computed +[eva:initial-state] Values of globals at initialization + v ∈ [--..--] +[eva] computing for function f <- main. + Called from stdnoreturn_h.c:18. +[eva] Recording results for f +[eva] Done for function f +[eva] computing for function g <- main. + Called from stdnoreturn_h.c:19. +[eva] Recording results for g +[eva] Done for function g +[eva] Recording results for main +[eva] done for function main +[eva] ====== VALUES COMPUTED ====== +[eva:final-states] Values at end of function f: + NON TERMINATING FUNCTION +[eva:final-states] Values at end of function g: + NON TERMINATING FUNCTION +[eva:final-states] Values at end of function main: + __retres ∈ {0} diff --git a/tests/libc/oracle/sys_types.res.oracle b/tests/libc/oracle/sys_types.res.oracle index bd50338df61de05aec784e2b28936ef4509bacce..43690a9dd32cb238190785c2661e9ff6248824c1 100644 --- a/tests/libc/oracle/sys_types.res.oracle +++ b/tests/libc/oracle/sys_types.res.oracle @@ -4,13 +4,9 @@ [eva] Initial state computed [eva:initial-state] Values of globals at initialization -[eva] computing for function makedev <- main. - Called from sys_types.c:4. -[eva] using specification for function makedev -[eva] Done for function makedev [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== [eva:final-states] Values at end of function main: - dev ∈ [--..--] + dev ∈ {298} __retres ∈ {0} diff --git a/tests/libc/oracle/time_h.res.oracle b/tests/libc/oracle/time_h.res.oracle index 8ca10a9c75bb91d418edde9ec05a82f26a82a1eb..1700a2d16a409383d26178f66d3732b5aee04684 100644 --- a/tests/libc/oracle/time_h.res.oracle +++ b/tests/libc/oracle/time_h.res.oracle @@ -233,10 +233,29 @@ function asctime: precondition 'initialization,init_timeptr' got status valid. [eva] Done for function asctime [eva:alarm] time_h.c:65: Warning: assertion got status unknown. +[eva] computing for function localtime <- main. + Called from time_h.c:67. +[eva] using specification for function localtime +[eva] time_h.c:67: + function localtime: precondition 'valid_timer' got status valid. +[eva] Done for function localtime +[eva] computing for function localtime_r <- main. + Called from time_h.c:69. +[eva] using specification for function localtime_r +[eva] time_h.c:69: + function localtime_r: precondition 'valid_timer' got status valid. +[eva] time_h.c:69: + function localtime_r: precondition 'valid_result' got status valid. +[eva] Done for function localtime_r +[eva] computing for function localtime_r <- main. + Called from time_h.c:69. +[eva] Done for function localtime_r +[eva] time_h.c:70: assertion got status valid. [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== [eva:final-states] Values at end of function main: + __fc_errno ∈ [--..--] __fc_ctime[0..25] ∈ [--..--] __fc_time_tm ∈ [--..--] Frama_C_entropy_source ∈ [--..--] @@ -252,4 +271,6 @@ t ∈ [--..--] res_time ∈ {{ NULL ; &mytime2 }} or UNINITIALIZED mytime2 ∈ [--..--] or UNINITIALIZED + localp ∈ {{ NULL ; &localr }} + localr ∈ [--..--] or UNINITIALIZED __retres ∈ {0; 1; 2} diff --git a/tests/libc/stdlib_c.c b/tests/libc/stdlib_c.c index 33dc8110214a11851008f465801601bf39f23e1b..065ed34d5cfc5f024dd837451311dc1bae16123c 100644 --- a/tests/libc/stdlib_c.c +++ b/tests/libc/stdlib_c.c @@ -53,5 +53,8 @@ int main() { free(resolved_name); realpath_res = realpath("/bin/ls", NULL); + char *canon = canonicalize_file_name("/bin/../etc"); + free(canon); + return 0; } diff --git a/tests/libc/stdnoreturn_h.c b/tests/libc/stdnoreturn_h.c new file mode 100644 index 0000000000000000000000000000000000000000..8b234faea6a3733b82d7c45f2b7c4f441497edeb --- /dev/null +++ b/tests/libc/stdnoreturn_h.c @@ -0,0 +1,20 @@ +/*run.config + STDOPT: #"-c11" +*/ + +#include <stdnoreturn.h> + +noreturn void f(void) { + while (1); +} + +_Noreturn void g(void) { + while (2); +} + +volatile int v; + +int main() { + if (v) f(); + if (v) g(); +} diff --git a/tests/libc/time_h.c b/tests/libc/time_h.c index 52a142905351a7d2c0f9fb5313707862b4125ee0..28d599ddb65d79f13cbd8adaf5df64b8a5ba406b 100644 --- a/tests/libc/time_h.c +++ b/tests/libc/time_h.c @@ -64,5 +64,10 @@ int main() { time_str = asctime(&mytime); //@ assert valid_string(time_str); + struct tm *localp = localtime(&t); + struct tm localr; + localp = localtime_r(&t, &localr); + //@ assert localp == \null || localp == &localr; + return 0; } diff --git a/tests/metrics/libc.c b/tests/metrics/libc.c index a753efa3828153397a9cc8869a58261701ab5f20..80ddfacff9876941d852d5847b1d7cd40f4815dd 100644 --- a/tests/metrics/libc.c +++ b/tests/metrics/libc.c @@ -1,6 +1,6 @@ /* run.config - STDOPT: #"-metrics-no-libc -metrics-eva-cover" - STDOPT: #"-metrics-libc -metrics-eva-cover" + EXECNOW: LOG @PTEST_NAME@_metrics.res LOG @PTEST_NAME@_metrics.err @frama-c@ @PTEST_FILE@ -metrics -metrics-libc -then -metrics-no-libc | @PTEST_SUITE_DIR@/../libc/check_some_metrics.sh "> 5" "> 100" "= 0" "> 10" "= 2" "= 6" "= 0" "= 0" "= 0" "= 4" >@PTEST_NAME@_metrics.res 2>@PTEST_NAME@_metrics.err + STDOPT: #"-metrics-eva-cover" LOG: libc.json STDOPT: #"-metrics-libc -metrics-output @PTEST_RESULT@/libc.json" */ diff --git a/tests/metrics/oracle/libc.1.res.oracle b/tests/metrics/oracle/libc.1.res.oracle index dfcb77f3aee0c8d35aebb3c99c7dcec1126c2dd6..1334ea6ba7f2ce1d2a266a2d45626085d55a8810 100644 --- a/tests/metrics/oracle/libc.1.res.oracle +++ b/tests/metrics/oracle/libc.1.res.oracle @@ -1,108 +1 @@ [kernel] Parsing libc.c (with preprocessing) -[metrics] Defined functions (7) - ===================== - bar (1 call); f (0 call); foo (1 call); g (address taken) (0 call); - getopt (1 call); h (1 call); main (0 call); - - Specified-only functions (124) - ============================== - _exit (0 call); access (0 call); asprintf (0 call); chdir (0 call); - chown (0 call); chroot (0 call); clearerr (0 call); - clearerr_unlocked (0 call); close (0 call); dup (0 call); dup2 (0 call); - execl (0 call); execle (0 call); execlp (0 call); execv (0 call); - execve (0 call); execvp (0 call); fclose (0 call); fdopen (0 call); - feof (0 call); feof_unlocked (0 call); ferror (0 call); - ferror_unlocked (0 call); fflush (0 call); fgetc (0 call); fgetpos (0 call); - fgets (0 call); fileno (0 call); fileno_unlocked (0 call); - flockfile (0 call); fopen (0 call); fork (0 call); fputc (0 call); - fputs (0 call); fread (0 call); freopen (0 call); fseek (0 call); - fseeko (0 call); fsetpos (0 call); ftell (0 call); ftello (0 call); - ftrylockfile (0 call); funlockfile (0 call); fwrite (0 call); getc (0 call); - getc_unlocked (0 call); getchar (1 call); getchar_unlocked (0 call); - getcwd (0 call); getegid (0 call); geteuid (0 call); getgid (0 call); - gethostname (0 call); getopt_long (0 call); getopt_long_only (0 call); - getpgid (0 call); getpgrp (0 call); getpid (0 call); getppid (0 call); - getresgid (0 call); getresuid (0 call); gets (0 call); getsid (0 call); - getuid (0 call); isalnum (0 call); isalpha (1 call); isascii (0 call); - isatty (0 call); isblank (1 call); iscntrl (0 call); isdigit (0 call); - isgraph (0 call); islower (0 call); isprint (0 call); ispunct (0 call); - isspace (0 call); isupper (0 call); isxdigit (0 call); lseek (0 call); - pathconf (0 call); pclose (0 call); perror (0 call); pipe (0 call); - popen (0 call); putc (0 call); putc_unlocked (0 call); putchar (0 call); - putchar_unlocked (0 call); puts (0 call); read (0 call); remove (0 call); - rename (0 call); rewind (0 call); setbuf (0 call); setegid (0 call); - seteuid (0 call); setgid (0 call); sethostname (0 call); setpgid (0 call); - setregid (0 call); setresgid (0 call); setresuid (0 call); - setreuid (0 call); setsid (0 call); setuid (0 call); setvbuf (0 call); - sleep (0 call); sync (0 call); sysconf (0 call); tmpfile (0 call); - tmpnam (0 call); tolower (0 call); toupper (0 call); ttyname (0 call); - ungetc (0 call); unlink (0 call); usleep (0 call); vfprintf (0 call); - vfscanf (0 call); vprintf (0 call); vscanf (0 call); vsnprintf (0 call); - vsprintf (0 call); write (0 call); - - Undefined and unspecified functions (0) - ======================================= - - - 'Extern' global variables (12) - ============================== - Frama_C_entropy_source; __fc_errno; __fc_fds; __fc_heap_status; - __fc_hostname; __fc_stdin; __fc_stdout; __fc_ttyname; optarg; opterr; - optind; optopt - - Potential entry points (2) - ========================== - f; main; - - Global metrics - ============== - Sloc = 20 - Decision point = 0 - Global variables = 18 - If = 0 - Loop = 0 - Goto = 0 - Assignment = 9 - Exit point = 7 - Function = 131 - Function call = 8 - Pointer dereferencing = 1 - Cyclomatic complexity = 7 -[eva] Analyzing a complete application starting at main -[eva] Computing initial state -[eva] Initial state computed -[eva:initial-state] Values of globals at initialization - fp ∈ {{ &g }} -[eva] using specification for function isalpha -[eva] using specification for function isblank -[eva] done for function main -[eva:summary] ====== ANALYSIS SUMMARY ====== - ---------------------------------------------------------------------------- - 5 functions analyzed (out of 6): 83% coverage. - In these functions, 13 statements reached (out of 13): 100% coverage. - ---------------------------------------------------------------------------- - No errors or warnings raised during the analysis. - ---------------------------------------------------------------------------- - 0 alarms generated by the analysis. - ---------------------------------------------------------------------------- - Evaluation of the logical properties reached by the analysis: - Assertions 0 valid 0 unknown 0 invalid 0 total - Preconditions 2 valid 0 unknown 0 invalid 2 total - 100% of the logical properties reached have been proven. - ---------------------------------------------------------------------------- -[metrics] Eva coverage statistics - ======================= - Syntactically reachable functions = 8 (out of 131) - Semantically reached functions = 8 - Coverage estimation = 100.0% -[metrics] References to non-analyzed functions - ------------------------------------ -[metrics] Statements analyzed by Eva - -------------------------- - 18 stmts in analyzed functions, 18 stmts analyzed (100.0%) - bar: 2 stmts out of 2 (100.0%) - foo: 2 stmts out of 2 (100.0%) - g: 2 stmts out of 2 (100.0%) - getopt: 5 stmts out of 5 (100.0%) - h: 2 stmts out of 2 (100.0%) - main: 5 stmts out of 5 (100.0%) diff --git a/tests/metrics/oracle/libc.2.res.oracle b/tests/metrics/oracle/libc.2.res.oracle deleted file mode 100644 index 1334ea6ba7f2ce1d2a266a2d45626085d55a8810..0000000000000000000000000000000000000000 --- a/tests/metrics/oracle/libc.2.res.oracle +++ /dev/null @@ -1 +0,0 @@ -[kernel] Parsing libc.c (with preprocessing) diff --git a/tests/metrics/oracle/libc_metrics.err b/tests/metrics/oracle/libc_metrics.err new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/metrics/oracle/libc_metrics.res b/tests/metrics/oracle/libc_metrics.res new file mode 100644 index 0000000000000000000000000000000000000000..bd056d31184ac4aa368a84cd783a7e683415b455 --- /dev/null +++ b/tests/metrics/oracle/libc_metrics.res @@ -0,0 +1,4 @@ +Checking libc metrics... +Checking run 1... +Checking run 2... +Finished checking libc metrics. diff --git a/tests/misc/interpreted_automata_dataflow_backward.ml b/tests/misc/interpreted_automata_dataflow_backward.ml index be12ce941874d759193954a5f85e43fa013c111b..3642c0c878fa095cf8dfe227eecd724136d67f46 100644 --- a/tests/misc/interpreted_automata_dataflow_backward.ml +++ b/tests/misc/interpreted_automata_dataflow_backward.ml @@ -10,7 +10,7 @@ struct let pretty fmt v = Pretty_utils.pp_iter ~sep:",@ " Set.iter Cil_datatype.Varinfo.pretty fmt v - + let join v1 v2 = Set.union v1 v2 @@ -27,7 +27,7 @@ struct | AlignOf _ | AlignOfE _ | AddrOf _ | StartOf _ -> Set.empty - | UnOp (_, e, _) | CastE (_,e) | Info (e,_) -> + | UnOp (_, e, _) | CastE (_,e) -> vars e | BinOp (_, e1, e2, _) -> Set.union (vars e1) (vars e2) @@ -37,7 +37,7 @@ struct let transfer t v = let open Interpreted_automata in let r = match t with - | Skip | Prop _ | Leave _ | Return (None,_) -> + | Skip | Prop _ | Leave _ | Return (None,_) -> v (* Nothing to do *) | Enter b -> Set.diff v (Set.of_list b.blocals) (* If unconditionnaly initialized, they should not be there *) diff --git a/tests/misc/my_visitor.c b/tests/misc/my_visitor.c index da957b1c8e130b2f5faa33e3c6a0daa54a305a62..ffb4b64f50373a83c58ea1efbeead58e23eee857 100644 --- a/tests/misc/my_visitor.c +++ b/tests/misc/my_visitor.c @@ -1,4 +1,6 @@ /* run.config + COMMENT: the following CMD redefinition omits adding @PTEST_FILE@ on purpose (due to -load) + CMD: @frama-c@ @PTEST_OPTIONS@ PLUGIN: MODULE: @PTEST_NAME@ EXECNOW: LOG my_visitor_sav.res LOG my_visitor_sav.err BIN my_visitor.sav @frama-c@ @PTEST_FILE@ -main f -save @PTEST_RESULT@/@PTEST_NAME@.sav > @PTEST_RESULT@/@PTEST_NAME@_sav.res 2> @PTEST_RESULT@/@PTEST_NAME@_sav.err diff --git a/tests/misc/obfuscate.c b/tests/misc/obfuscate.c index 0fb0323afb82e831788ae82bd525b0934b68d17f..34a705ecd97ca90d66573bd8004055383e0d0710 100644 --- a/tests/misc/obfuscate.c +++ b/tests/misc/obfuscate.c @@ -72,3 +72,9 @@ void implem(int c, int d) { }; struct S example_struct = { .my_func = implem }; void test_func(struct S* s) { s->my_func(3,4); example_struct.my_func(5,6); } + +// Check that these definitions do not make obfuscate crash +/*@ axiomatic A { predicate P(void (*galois_fp_old)()); } */ +/*@ axiomatic A1 { predicate P1(void (*galois_fp_old)()); } */ +void my_f() {} +/*@ lemma OK: P(my_f) && P1(my_f); */ diff --git a/tests/misc/oracle/my_visitor.0.res.oracle b/tests/misc/oracle/my_visitor.0.res.oracle index 757a20ca369650eea0ce2c3162081003a9e5dc0d..99cdff68fd11aa9c4e57c0818df7f5a2584787f3 100644 --- a/tests/misc/oracle/my_visitor.0.res.oracle +++ b/tests/misc/oracle/my_visitor.0.res.oracle @@ -1,4 +1,3 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. /* Generated by Frama-C */ int f(void) { diff --git a/tests/misc/oracle/my_visitor.1.res.oracle b/tests/misc/oracle/my_visitor.1.res.oracle index 14717c12726eef25759c4b1f52744367b6b3fe94..cb5171adca05ef60341ce5813896eed563af564e 100644 --- a/tests/misc/oracle/my_visitor.1.res.oracle +++ b/tests/misc/oracle/my_visitor.1.res.oracle @@ -4,7 +4,6 @@ [kernel] Warning: emitter emitter1: correctness parameter -s does not exist anymore. Ignored. [kernel] Warning: emitter emitter2: correctness parameter -s2 does not exist anymore. Ignored. [kernel] Warning: 15 states in saved file ignored. They are invalid in this Frama-C configuration. -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. /* Generated by Frama-C */ int f(void) { diff --git a/tests/misc/oracle/obfuscate.res.oracle b/tests/misc/oracle/obfuscate.res.oracle index aff1fe68f7f7548e63cdf99dfdb8044740ebc582..43c1ebcead182231c1e7203b8fe1b78129a26638 100644 --- a/tests/misc/oracle/obfuscate.res.oracle +++ b/tests/misc/oracle/obfuscate.res.oracle @@ -5,6 +5,9 @@ /* *********************************** */ /* start of dictionary for obfuscation */ /* *********************************** */ +// axiomatics +#define A1 A +#define A2 A1 // behaviors #define B1 bhv // enums @@ -18,6 +21,7 @@ #define F4 builtin_and_stdlib #define F5 implem #define F6 test_func +#define F7 my_f // global variables #define G1 my_var #define G2 example_struct @@ -27,11 +31,17 @@ // logic constructors #define LC1 T #define LC2 F +// lemmas +#define LE1 OK // logic types #define LT1 t // logic variables #define LV1 I #define LV2 x +#define LV3 P +#define LV4 galois_fp_old +#define LV5 P1 +#define LV6 galois_fp_old // fields #define M1 my_func // predicates @@ -164,4 +174,23 @@ void F6(struct T2 *f6) return; } +/*@ axiomatic A1 { + predicate LV3(void (*LV4)()) ; + + } + */ +/*@ axiomatic A2 { + predicate LV5(void (*LV6)()) ; + + } + +*/ +void F7(void) +{ + return; +} + +/*@ lemma LE1{L}: LV3((void (*)())(&F7)) ∧ LV5((void (*)())(&F7)); + +*/ diff --git a/tests/misc/oracle/orphan_emitter.res.oracle b/tests/misc/oracle/orphan_emitter.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..b4a4e9e9636b1ef49df2c0fd7a6aaf94a196a565 --- /dev/null +++ b/tests/misc/oracle/orphan_emitter.res.oracle @@ -0,0 +1,2 @@ +[kernel] Warning: emitter emitter1: correctness parameter -orphan does not exist anymore. Ignored. +[kernel] Warning: 11 states in saved file ignored. They are invalid in this Frama-C configuration. diff --git a/tests/misc/oracle/orphan_emitter_sav.err b/tests/misc/oracle/orphan_emitter_sav.err new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/misc/oracle/orphan_emitter_sav.res b/tests/misc/oracle/orphan_emitter_sav.res new file mode 100644 index 0000000000000000000000000000000000000000..8a5aa9b933fce678411ffde32a3361b0f2f4ce08 --- /dev/null +++ b/tests/misc/oracle/orphan_emitter_sav.res @@ -0,0 +1 @@ +[kernel] Parsing orphan_emitter.i (no preprocessing) diff --git a/tests/misc/orphan_emitter.i b/tests/misc/orphan_emitter.i new file mode 100644 index 0000000000000000000000000000000000000000..43b7d53e648cbfb3063b93f83cae64e896ac15ab --- /dev/null +++ b/tests/misc/orphan_emitter.i @@ -0,0 +1,12 @@ +/* run.config + PLUGIN: @EVA_PLUGINS@ + MODULE: @PTEST_NAME@ + EXECNOW: BIN @PTEST_NAME@.sav LOG @PTEST_NAME@_sav.res LOG @PTEST_NAME@_sav.err @frama-c@ @PTEST_FILE@ -save @PTEST_NAME@.sav > @PTEST_NAME@_sav.res 2> @PTEST_NAME@_sav.err + MODULE: + COMMENT: the CMD line below omits @PTEST_FILE@ on purpose (due to -load) + CMD: @frama-c@ @PTEST_OPTIONS@ + OPT: -load %{dep:@PTEST_NAME@.sav} -eva -eva-verbose 0 +*/ +int main() { + return 0; +} diff --git a/tests/misc/orphan_emitter.ml b/tests/misc/orphan_emitter.ml new file mode 100644 index 0000000000000000000000000000000000000000..573894ba52e7d833dad60df9e527c724769e1e63 --- /dev/null +++ b/tests/misc/orphan_emitter.ml @@ -0,0 +1,21 @@ +module P = + Plugin.Register + (struct + let name = "Orphan" + let shortname = "orphan" + let help = "" + end) + +module S = + P.True(struct let option_name = "-orphan" let help = "" end) + +let emitter1 = + Emitter.create "emitter1" [ Emitter.Code_annot ] + ~correctness:[ S.parameter ] ~tuning:[] + +let main () = + let kf = Globals.Functions.find_by_name "main" in + let stmt = Kernel_function.find_first_stmt kf in + Annotations.add_assert emitter1 stmt Logic_const.ptrue + +let () = Db.Main.extend main diff --git a/tests/rte/oracle/addsub.res.oracle b/tests/rte/oracle/addsub.res.oracle index f0c866b0d21efe21d28ccd486d3ee704512eb4f0..b4dac4895abbfa1d9a4712046615a6237c0c7d4b 100644 --- a/tests/rte/oracle/addsub.res.oracle +++ b/tests/rte/oracle/addsub.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing addsub.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] addsub.c:9: Warning: guaranteed RTE: assert signed_overflow: 0x7fffffff + 0x7fffffff ≤ 2147483647; diff --git a/tests/rte/oracle/addsub_typedef.res.oracle b/tests/rte/oracle/addsub_typedef.res.oracle index 55692cc6d031b8c8c5d5f351f73c688438abdf70..3c40e7028ebc3850682949bc120e4907f6867404 100644 --- a/tests/rte/oracle/addsub_typedef.res.oracle +++ b/tests/rte/oracle/addsub_typedef.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing addsub_typedef.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] addsub_typedef.c:11: Warning: guaranteed RTE: assert signed_overflow: 0x7fffffff + 0x7fffffff ≤ 2147483647; diff --git a/tests/rte/oracle/addsub_unsigned.0.res.oracle b/tests/rte/oracle/addsub_unsigned.0.res.oracle index c99071aead7dec5ab6d13bcc935c677fdfbdf27d..4ea2c8d41feee159266b4a9e583cb5afad7de3fb 100644 --- a/tests/rte/oracle/addsub_unsigned.0.res.oracle +++ b/tests/rte/oracle/addsub_unsigned.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing addsub_unsigned.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(void) { diff --git a/tests/rte/oracle/addsub_unsigned.1.res.oracle b/tests/rte/oracle/addsub_unsigned.1.res.oracle index 0e2ae091f462321edf2f03b6b8c35766889bad60..8a84f4ca3ccb9721cffc8c4867a8eb4cf4e5d4e7 100644 --- a/tests/rte/oracle/addsub_unsigned.1.res.oracle +++ b/tests/rte/oracle/addsub_unsigned.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing addsub_unsigned.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] addsub_unsigned.c:12: Warning: guaranteed RTE: assert unsigned_overflow: 0x80000000U + 0x80000000U ≤ 4294967295; diff --git a/tests/rte/oracle/addsub_unsigned_typedef.0.res.oracle b/tests/rte/oracle/addsub_unsigned_typedef.0.res.oracle index 9852fff86bbc1c9e24e4fedeebc541adde8128cb..2311039ae1d45dc573f3873273e8e98950634475 100644 --- a/tests/rte/oracle/addsub_unsigned_typedef.0.res.oracle +++ b/tests/rte/oracle/addsub_unsigned_typedef.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing addsub_unsigned_typedef.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ typedef unsigned int uint; int main(void) diff --git a/tests/rte/oracle/addsub_unsigned_typedef.1.res.oracle b/tests/rte/oracle/addsub_unsigned_typedef.1.res.oracle index 4df8f61afa49717d246cc1a177ad30f148c67d12..eff8fadf68bf0be7e364d137632c0d1f81cd4540 100644 --- a/tests/rte/oracle/addsub_unsigned_typedef.1.res.oracle +++ b/tests/rte/oracle/addsub_unsigned_typedef.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing addsub_unsigned_typedef.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] addsub_unsigned_typedef.c:14: Warning: guaranteed RTE: assert unsigned_overflow: 0x80000000U + 0x80000000U ≤ 4294967295; diff --git a/tests/rte/oracle/array_index.0.res.oracle b/tests/rte/oracle/array_index.0.res.oracle index 8accf01a55dc343bab04ca7d4977572f0d72fd11..b4dc5ead5aa2c07c804ab5501dde97202b9e4916 100644 --- a/tests/rte/oracle/array_index.0.res.oracle +++ b/tests/rte/oracle/array_index.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing array_index.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ struct s_arr { int t[15] ; @@ -70,7 +70,7 @@ void main(int i, int j, unsigned int k) } -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ struct s_arr { int t[15] ; diff --git a/tests/rte/oracle/array_index.1.res.oracle b/tests/rte/oracle/array_index.1.res.oracle index 1ed933d0895f146fe16f9dfba43f968400b6e3f1..c874d736490e80bc174c5100f82ad301be679fee 100644 --- a/tests/rte/oracle/array_index.1.res.oracle +++ b/tests/rte/oracle/array_index.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing array_index.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ struct s_arr { int t[15] ; diff --git a/tests/rte/oracle/assign.res.oracle b/tests/rte/oracle/assign.res.oracle index fcfb2be909a7a746c433e6bce806fecd6035bc50..ca5c9db5783dcdfdad1ad1410409f7b973af34c6 100644 --- a/tests/rte/oracle/assign.res.oracle +++ b/tests/rte/oracle/assign.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing assign.c (with preprocessing) -[rte] annotating function rte +[rte:annot] annotating function rte /* Generated by Frama-C */ int global_x; int global_y; diff --git a/tests/rte/oracle/assign2.res.oracle b/tests/rte/oracle/assign2.res.oracle index bbe12161c39f1e1b8dbf9595f23c1930a7f9ad71..d74bcff7ce69a6d58544ac2557c0b275b40c9548 100644 --- a/tests/rte/oracle/assign2.res.oracle +++ b/tests/rte/oracle/assign2.res.oracle @@ -1,6 +1,6 @@ [kernel] Parsing assign2.c (with preprocessing) -[rte] annotating function f -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function main /* Generated by Frama-C */ int i; int t[10]; diff --git a/tests/rte/oracle/assign3.res.oracle b/tests/rte/oracle/assign3.res.oracle index a7bd3a047b9c2d4180571ba12faa0fd3f803ae83..f8c3cc3879fab231263728a29c41504a18bd3760 100644 --- a/tests/rte/oracle/assign3.res.oracle +++ b/tests/rte/oracle/assign3.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing assign3.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ /*@ assigns \nothing; */ int f(void); diff --git a/tests/rte/oracle/assign4.res.oracle b/tests/rte/oracle/assign4.res.oracle index a232f0d1d596b429c2f64b41c7c8d7c67ee2859d..60a3b9a2bc6a996182f6f6798c92a98fbc9e5ada 100644 --- a/tests/rte/oracle/assign4.res.oracle +++ b/tests/rte/oracle/assign4.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing assign4.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ /*@ assigns \result; assigns \result \from min, max; */ diff --git a/tests/rte/oracle/assign5.res.oracle b/tests/rte/oracle/assign5.res.oracle index 838610a781c0c47a07f8b9de0b730ebfc36f8f09..72815caa8d8ac14e38de16589b811f7390bb55db 100644 --- a/tests/rte/oracle/assign5.res.oracle +++ b/tests/rte/oracle/assign5.res.oracle @@ -3,7 +3,7 @@ Drop '*p' \from at assign5.c:9 for more precise one at assign5.c:10 [kernel:annot:multi-from] Warning: Drop '*p' \from at assign5.c:19 for more precise one at assign5.c:18 -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ /*@ assigns *p; assigns *p \from \nothing; */ diff --git a/tests/rte/oracle/assign6.res.oracle b/tests/rte/oracle/assign6.res.oracle index cc82419239229df12a43e0121fd42d2136f2b695..b6a449d4decb9b789553e0afdb3e29c25f4e4be4 100644 --- a/tests/rte/oracle/assign6.res.oracle +++ b/tests/rte/oracle/assign6.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing assign6.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int z; /*@ assigns z, \result; diff --git a/tests/rte/oracle/assign7.res.oracle b/tests/rte/oracle/assign7.res.oracle index e7533eeb90197415ce55a38df0ab5adf087f9177..6ba453fd9abebb4bc7229fab8a8b81eb932fc973 100644 --- a/tests/rte/oracle/assign7.res.oracle +++ b/tests/rte/oracle/assign7.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing assign7.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ /*@ assigns *p; assigns *p \from {*((char *)p), *q}; */ diff --git a/tests/rte/oracle/bool.res.oracle b/tests/rte/oracle/bool.res.oracle index d215b26dbeabe81d4cd19dc2bb21cc00ede795d9..a8c11132b82c84e734c9b4de007931595c68fce1 100644 --- a/tests/rte/oracle/bool.res.oracle +++ b/tests/rte/oracle/bool.res.oracle @@ -1,8 +1,8 @@ [kernel] Parsing bool.i (no preprocessing) -[rte] annotating function ko1 -[rte] annotating function ko2 -[rte] annotating function ok1 -[rte] annotating function ok2 +[rte:annot] annotating function ko1 +[rte:annot] annotating function ko2 +[rte:annot] annotating function ok1 +[rte:annot] annotating function ok2 /* Generated by Frama-C */ struct s_bool { char c ; @@ -57,10 +57,10 @@ _Bool ok2(int a, _Bool b) } -[rte] annotating function ko1 -[rte] annotating function ko2 -[rte] annotating function ok1 -[rte] annotating function ok2 +[rte:annot] annotating function ko1 +[rte:annot] annotating function ko2 +[rte:annot] annotating function ok1 +[rte:annot] annotating function ok2 /* Generated by Frama-C */ struct s_bool { char c ; diff --git a/tests/rte/oracle/bts0567.res.oracle b/tests/rte/oracle/bts0567.res.oracle index 124606df9992905befe1bb47798331da77c86c2e..460f19e9262766b75e7eecf4c83cd134e2bc4dc2 100644 --- a/tests/rte/oracle/bts0567.res.oracle +++ b/tests/rte/oracle/bts0567.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing bts0567.c (with preprocessing) -[rte] annotating function g +[rte:annot] annotating function g /* Generated by Frama-C */ int tab[2]; /*@ requires \valid(p + 1); */ diff --git a/tests/rte/oracle/bts0576.res.oracle b/tests/rte/oracle/bts0576.res.oracle index 301f69b8472518b1da1d6fbf5537f3747355cd3d..fe8a1ac974626ba3be47060ba2806de74b51d719 100644 --- a/tests/rte/oracle/bts0576.res.oracle +++ b/tests/rte/oracle/bts0576.res.oracle @@ -3,8 +3,8 @@ parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. [kernel] bts0576.c:6: Warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. -[rte] annotating function f4 -[rte] annotating function g4 +[rte:annot] annotating function f4 +[rte:annot] annotating function g4 /* Generated by Frama-C */ typedef double typetab[2]; /*@ requires diff --git a/tests/rte/oracle/bts0580.res.oracle b/tests/rte/oracle/bts0580.res.oracle index 86ffdc6a61bad80f8fd95c3af08ca20656b1a963..b2e54ea6b5d43eeb3f20ca58ff0a0f9a3d3bf5e9 100644 --- a/tests/rte/oracle/bts0580.res.oracle +++ b/tests/rte/oracle/bts0580.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing bts0580.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ struct ArrayStruct { int data[10] ; diff --git a/tests/rte/oracle/bts0580_2.res.oracle b/tests/rte/oracle/bts0580_2.res.oracle index 86213f1e2e4a0c76a88eba8f3247a8f6bf1ec127..cbd014a78b6a95d93360b8e251fc45bff4c8364b 100644 --- a/tests/rte/oracle/bts0580_2.res.oracle +++ b/tests/rte/oracle/bts0580_2.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing bts0580_2.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ struct S { int val ; diff --git a/tests/rte/oracle/bts1052.res.oracle b/tests/rte/oracle/bts1052.res.oracle index 8d80a63a7885804420ae0338ed1ef2a6f33ebaac..d2a4ffff649b68e46aeef864f11adc88313148ff 100644 --- a/tests/rte/oracle/bts1052.res.oracle +++ b/tests/rte/oracle/bts1052.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing bts1052.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ /*@ ensures \let count = \old(d); \result ≡ count; assigns \nothing; */ diff --git a/tests/rte/oracle/bts2314.res.oracle b/tests/rte/oracle/bts2314.res.oracle index e2078a75b5383fc4b77ab7d881f0b3155434086c..750e1ede564a90adfc376233ab09e8cf2ffadd02 100644 --- a/tests/rte/oracle/bts2314.res.oracle +++ b/tests/rte/oracle/bts2314.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing bts2314.i (no preprocessing) -[rte] annotating function foo +[rte:annot] annotating function foo /* Generated by Frama-C */ struct STR { int num : 7 ; diff --git a/tests/rte/oracle/bts621.res.oracle b/tests/rte/oracle/bts621.res.oracle index d5d1f93ac89792a8ca881390a4f705dc25124782..86d3ba9505b98a0622068997d6002a56aef6cc74 100644 --- a/tests/rte/oracle/bts621.res.oracle +++ b/tests/rte/oracle/bts621.res.oracle @@ -10,7 +10,7 @@ void f(void) /*@ ghost (float a) */ } -[rte] annotating function f +[rte:annot] annotating function f /* Generated by Frama-C */ /*@ ghost /@ assigns *p; @/ float g(float \ghost *p); */ diff --git a/tests/rte/oracle/castoncall.0.res.oracle b/tests/rte/oracle/castoncall.0.res.oracle index e9626099a5c174f5451a72844c1101a8ca920002..2e6f716bbe1c6be7c2261cb5c4b6190e3df24492 100644 --- a/tests/rte/oracle/castoncall.0.res.oracle +++ b/tests/rte/oracle/castoncall.0.res.oracle @@ -1,6 +1,6 @@ [kernel] Parsing castoncall.c (with preprocessing) -[rte] annotating function g -[rte] annotating function nondet_ptr +[rte:annot] annotating function g +[rte:annot] annotating function nondet_ptr /* Generated by Frama-C */ /*@ ensures \result ≡ \old(a) ∨ \result ≡ \old(b); assigns \result; diff --git a/tests/rte/oracle/castoncall.1.res.oracle b/tests/rte/oracle/castoncall.1.res.oracle index e9626099a5c174f5451a72844c1101a8ca920002..2e6f716bbe1c6be7c2261cb5c4b6190e3df24492 100644 --- a/tests/rte/oracle/castoncall.1.res.oracle +++ b/tests/rte/oracle/castoncall.1.res.oracle @@ -1,6 +1,6 @@ [kernel] Parsing castoncall.c (with preprocessing) -[rte] annotating function g -[rte] annotating function nondet_ptr +[rte:annot] annotating function g +[rte:annot] annotating function nondet_ptr /* Generated by Frama-C */ /*@ ensures \result ≡ \old(a) ∨ \result ≡ \old(b); assigns \result; diff --git a/tests/rte/oracle/divmod.res.oracle b/tests/rte/oracle/divmod.res.oracle index f7f9626762ac19e218518238d3c8636174a0f0b9..547de8eb072a7a22a19f9248bf80dfda2672bc44 100644 --- a/tests/rte/oracle/divmod.res.oracle +++ b/tests/rte/oracle/divmod.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing divmod.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] divmod.c:13: Warning: guaranteed RTE: assert diff --git a/tests/rte/oracle/divmod_typedef.res.oracle b/tests/rte/oracle/divmod_typedef.res.oracle index 9d2cba27982e54d9bfb1bba23de7f6ac5179cd1d..e87059926ae6ea679c3aa891622f42e1b1b96f7f 100644 --- a/tests/rte/oracle/divmod_typedef.res.oracle +++ b/tests/rte/oracle/divmod_typedef.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing divmod_typedef.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] divmod_typedef.c:15: Warning: guaranteed RTE: assert diff --git a/tests/rte/oracle/downcast.0.res.oracle b/tests/rte/oracle/downcast.0.res.oracle index 6cad4d434e8a640d27237196e90b821777ae7798..f0eb8647a50823b0998aa831ba8959da03429ec1 100644 --- a/tests/rte/oracle/downcast.0.res.oracle +++ b/tests/rte/oracle/downcast.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing downcast.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(void) { diff --git a/tests/rte/oracle/downcast.1.res.oracle b/tests/rte/oracle/downcast.1.res.oracle index a99e7d028ad364f7e49c3b1188c785ee7816a273..e2c3482d90a18e6150b45080f3788e59da6ef7da 100644 --- a/tests/rte/oracle/downcast.1.res.oracle +++ b/tests/rte/oracle/downcast.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing downcast.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(void) { diff --git a/tests/rte/oracle/downcast.2.res.oracle b/tests/rte/oracle/downcast.2.res.oracle index 4335c6b252d14d919ab9bf70c14102d3051c8874..90eac7967f43cb758d01ee973169638affbca14a 100644 --- a/tests/rte/oracle/downcast.2.res.oracle +++ b/tests/rte/oracle/downcast.2.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing downcast.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(void) { diff --git a/tests/rte/oracle/finite_float.res.oracle b/tests/rte/oracle/finite_float.res.oracle index 8d1f55b0872281aa5c212e7b2aba34bd41e0e4ed..9384123fbe73e75f4df1f7acc8fded59832f7e44 100644 --- a/tests/rte/oracle/finite_float.res.oracle +++ b/tests/rte/oracle/finite_float.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing finite_float.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ #include "errno.h" #include "math.h" diff --git a/tests/rte/oracle/float_to_int.res.oracle b/tests/rte/oracle/float_to_int.res.oracle index 66a24415256c21b4c9f68c51b4ae360b2191f600..85321b80f0c8473e16cf6846e56fc7a1a833c45c 100644 --- a/tests/rte/oracle/float_to_int.res.oracle +++ b/tests/rte/oracle/float_to_int.res.oracle @@ -2,7 +2,7 @@ [kernel:parser:decimal-float] float_to_int.c:13: Warning: Floating-point constant 1.5e255 is not represented exactly. Will use 0x1.99309cc247f15p847. (warn-once: no further messages from category 'parser:decimal-float' will be emitted) -[rte] annotating function main +[rte:annot] annotating function main [rte] float_to_int.c:14: Warning: guaranteed RTE: assert float_to_int: 258. < 128; [rte] float_to_int.c:16: Warning: diff --git a/tests/rte/oracle/fptr_assert.res.oracle b/tests/rte/oracle/fptr_assert.res.oracle index 408070ad2a98b2091ddfe9be3e9a9e5ad0321565..f48df710fe1efdd1df9253038c02dc72bd40b305 100644 --- a/tests/rte/oracle/fptr_assert.res.oracle +++ b/tests/rte/oracle/fptr_assert.res.oracle @@ -1,8 +1,8 @@ [kernel] Parsing fptr_assert.c (with preprocessing) -[rte] annotating function f -[rte] annotating function g -[rte] annotating function h -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function g +[rte:annot] annotating function h +[rte:annot] annotating function main /* Generated by Frama-C */ typedef int (*fptr)(int ); void g(void) diff --git a/tests/rte/oracle/gnu_zero_length.res.oracle b/tests/rte/oracle/gnu_zero_length.res.oracle index b5373e6738d8a7a4c9e961627b8b56a4f6cbb0e5..29ec3ac3638a2a2d2a18c44147143adca28f3e5a 100644 --- a/tests/rte/oracle/gnu_zero_length.res.oracle +++ b/tests/rte/oracle/gnu_zero_length.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing gnu_zero_length.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ #include "stdlib.h" struct S { diff --git a/tests/rte/oracle/initialized-ignore-fct.0.res.oracle b/tests/rte/oracle/initialized-ignore-fct.0.res.oracle index b5622559b367a0dd9accf67154ca8c5016f6a4e5..2d021d4b453a5087b06a36c60224ad92e9713465 100644 --- a/tests/rte/oracle/initialized-ignore-fct.0.res.oracle +++ b/tests/rte/oracle/initialized-ignore-fct.0.res.oracle @@ -1,6 +1,6 @@ [kernel] Parsing initialized-ignore-fct.i (no preprocessing) -[rte] annotating function f1 -[rte] annotating function f2 +[rte:annot] annotating function f1 +[rte:annot] annotating function f2 /* Generated by Frama-C */ int f1(void) { diff --git a/tests/rte/oracle/initialized-ignore-fct.1.res.oracle b/tests/rte/oracle/initialized-ignore-fct.1.res.oracle index de012787ba2ce83d57137da8883486b8275823a9..bd848564e8f04c5f40bad5386074df6ef7f6ee3f 100644 --- a/tests/rte/oracle/initialized-ignore-fct.1.res.oracle +++ b/tests/rte/oracle/initialized-ignore-fct.1.res.oracle @@ -1,6 +1,6 @@ [kernel] Parsing initialized-ignore-fct.i (no preprocessing) -[rte] annotating function f1 -[rte] annotating function f2 +[rte:annot] annotating function f1 +[rte:annot] annotating function f2 /* Generated by Frama-C */ int f1(void) { diff --git a/tests/rte/oracle/initialized.res.oracle b/tests/rte/oracle/initialized.res.oracle index b03435818eae10b0af0098e72c964e726903f2d8..e1f4052e4bdbd3aad78ce1c93c8a957870cfb15c 100644 --- a/tests/rte/oracle/initialized.res.oracle +++ b/tests/rte/oracle/initialized.res.oracle @@ -2,9 +2,9 @@ [kernel:parser:decimal-float] initialized.c:111: Warning: Floating-point constant 1.1234 is not represented exactly. Will use 0x1.1f972474538efp0. (warn-once: no further messages from category 'parser:decimal-float' will be emitted) -[rte] annotating function f -[rte] annotating function g -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function g +[rte:annot] annotating function main /* Generated by Frama-C */ struct R { int v ; diff --git a/tests/rte/oracle/initialized_union.0.res.oracle b/tests/rte/oracle/initialized_union.0.res.oracle index 363a06a2446bc1b0a4ce62d9e7226d8cf4e0daa9..cf3f97b0fcf44d909c8a6e6453e9e680607e2896 100644 --- a/tests/rte/oracle/initialized_union.0.res.oracle +++ b/tests/rte/oracle/initialized_union.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing initialized_union.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ union U { char c ; diff --git a/tests/rte/oracle/initialized_union.1.res.oracle b/tests/rte/oracle/initialized_union.1.res.oracle index 5123e79dcd4f96a6ece38caa61d7fa378db44c85..fac802cd4611fc15de726ea1f1ba5106057d8463 100644 --- a/tests/rte/oracle/initialized_union.1.res.oracle +++ b/tests/rte/oracle/initialized_union.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing initialized_union.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ union U { char c ; diff --git a/tests/rte/oracle/invalid_fptr.res.oracle b/tests/rte/oracle/invalid_fptr.res.oracle index 8e8c9e80b62f2f39637dacdb87bf7ebdd0d935a1..65c8cdee74afa99ef846fb5984c3701c9f45c54b 100644 --- a/tests/rte/oracle/invalid_fptr.res.oracle +++ b/tests/rte/oracle/invalid_fptr.res.oracle @@ -1,7 +1,7 @@ [kernel] Parsing invalid_fptr.i (no preprocessing) -[rte] annotating function f -[rte] annotating function g -[rte] annotating function h +[rte:annot] annotating function f +[rte:annot] annotating function g +[rte:annot] annotating function h /* Generated by Frama-C */ struct S { void (*f)(void) ; diff --git a/tests/rte/oracle/malloc.res.oracle b/tests/rte/oracle/malloc.res.oracle index e5a358b1766c97a7df648de8af00cbe876abda92..d90e7d2052044627005426148f2733cdd55a27ed 100644 --- a/tests/rte/oracle/malloc.res.oracle +++ b/tests/rte/oracle/malloc.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing malloc.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ /*@ ensures \result ≡ \null ∨ \fresh{Old, Here}(\result,10); allocates \result; diff --git a/tests/rte/oracle/memaccess.res.oracle b/tests/rte/oracle/memaccess.res.oracle index 9890fa2ce1f31a803cfbbcd791c1abcfa1d510ba..570dd686f62bf8a94e681052f69fab1a84be25aa 100644 --- a/tests/rte/oracle/memaccess.res.oracle +++ b/tests/rte/oracle/memaccess.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing memaccess.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(int x) { diff --git a/tests/rte/oracle/minus.0.res.oracle b/tests/rte/oracle/minus.0.res.oracle index ea528f3492b12c29f248d07ecbe22f2ca50e6e03..77df3b0b03d4a660022539fbccd38d12177d4e60 100644 --- a/tests/rte/oracle/minus.0.res.oracle +++ b/tests/rte/oracle/minus.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing minus.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] minus.c:11: Warning: guaranteed RTE: assert signed_overflow: -2147483647 ≤ (int)(-0x7fffffff) - 1; diff --git a/tests/rte/oracle/minus.1.res.oracle b/tests/rte/oracle/minus.1.res.oracle index 93157b6539b3417fdb709731c094222b576b234b..4680985ca143b0f3f99aa520590ed9663da49e40 100644 --- a/tests/rte/oracle/minus.1.res.oracle +++ b/tests/rte/oracle/minus.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing minus.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(void) { diff --git a/tests/rte/oracle/mul.res.oracle b/tests/rte/oracle/mul.res.oracle index 690b65668dccbfcebeaaf8cddd7420d81426bccd..7780b2f1df41b16655dc7a582d3f9f9bd534fabf 100644 --- a/tests/rte/oracle/mul.res.oracle +++ b/tests/rte/oracle/mul.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing mul.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] mul.c:22: Warning: guaranteed RTE: assert signed_overflow: 0xffff * 0xffff ≤ 2147483647; [rte] mul.c:25: Warning: diff --git a/tests/rte/oracle/noresult.res.oracle b/tests/rte/oracle/noresult.res.oracle index 429612edba6d1b3d4dc6b8950415b5a39182aedc..500f819e490f4a8f8bf4ec26826bdb6ba1c80ef4 100644 --- a/tests/rte/oracle/noresult.res.oracle +++ b/tests/rte/oracle/noresult.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing noresult.c (with preprocessing) -[rte] annotating function job +[rte:annot] annotating function job /* Generated by Frama-C */ int x; /*@ ensures \result > 0; diff --git a/tests/rte/oracle/postcond.res.oracle b/tests/rte/oracle/postcond.res.oracle index 44f61804593a60c4ce2e5c2f2c5c4d41a3fdd6c3..90c0eea09219fe670d7c5f6a6e3109be770fac42 100644 --- a/tests/rte/oracle/postcond.res.oracle +++ b/tests/rte/oracle/postcond.res.oracle @@ -1,7 +1,7 @@ [kernel] Parsing postcond.c (with preprocessing) -[rte] annotating function f -[rte] annotating function g -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function g +[rte:annot] annotating function main /* Generated by Frama-C */ /*@ ensures \result ≡ -\old(x); diff --git a/tests/rte/oracle/postcond2.res.oracle b/tests/rte/oracle/postcond2.res.oracle index eb5282ae2d4ba91faefc3855b5d781dad82251ea..8295cfe205a8c7ef75444a26ff488d2adb3bbd6f 100644 --- a/tests/rte/oracle/postcond2.res.oracle +++ b/tests/rte/oracle/postcond2.res.oracle @@ -1,8 +1,8 @@ [kernel] Parsing postcond2.c (with preprocessing) [kernel] postcond2.c:7: Warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. -[rte] annotating function f -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function main /* Generated by Frama-C */ /*@ requires \valid(x); requires \valid(x + (0 .. 10)); diff --git a/tests/rte/oracle/precond.res.oracle b/tests/rte/oracle/precond.res.oracle index c538407703edd8a5335ddfbf5345194b6f6001a7..edc7bde6dcd35c38afae13517f04edda40fe688e 100644 --- a/tests/rte/oracle/precond.res.oracle +++ b/tests/rte/oracle/precond.res.oracle @@ -1,15 +1,15 @@ [kernel] Parsing precond.c (with preprocessing) [kernel] precond.c:27: Warning: parsing obsolete ACSL construct '\valid_range(addr,min,max)'. '\valid(addr+(min..max))' should be used instead. -[rte] annotating function f -[rte] annotating function g -[rte] annotating function h -[rte] annotating function main -[rte] annotating function next_val -[rte] annotating function set -[rte] annotating function tabtop_set -[rte] annotating function top_next -[rte] annotating function top_set +[rte:annot] annotating function f +[rte:annot] annotating function g +[rte:annot] annotating function h +[rte:annot] annotating function main +[rte:annot] annotating function next_val +[rte:annot] annotating function set +[rte:annot] annotating function tabtop_set +[rte:annot] annotating function top_next +[rte:annot] annotating function top_set /* Generated by Frama-C */ struct cell { int val ; diff --git a/tests/rte/oracle/precond2.res.oracle b/tests/rte/oracle/precond2.res.oracle index be1becab2f9f402e00bfad079a46fbad526286dc..c9a7dadda29c21d7a546122d350f9c5f637e1a2c 100644 --- a/tests/rte/oracle/precond2.res.oracle +++ b/tests/rte/oracle/precond2.res.oracle @@ -36,9 +36,9 @@ int main(void) [kernel] kf = g rte_gen_status = false [kernel] kf = main rte_gen_status = false [kernel] computing rte-div annotations -[rte] annotating function f -[rte] annotating function g -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function g +[rte:annot] annotating function main /* Generated by Frama-C */ int global = 15; /*@ requires x > 0; diff --git a/tests/rte/oracle/reqlabl.res.oracle b/tests/rte/oracle/reqlabl.res.oracle index 29a3506c575e027125136da523e2626b675e71f4..b17860e0ac4e5ec52ad9c2917aae5a2fa9da3b47 100644 --- a/tests/rte/oracle/reqlabl.res.oracle +++ b/tests/rte/oracle/reqlabl.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing reqlabl.c (with preprocessing) -[rte] annotating function g +[rte:annot] annotating function g /* Generated by Frama-C */ /*@ requires PROP_SUR_982: x > 0; */ int f(int x); diff --git a/tests/rte/oracle/reqlabl2.res.oracle b/tests/rte/oracle/reqlabl2.res.oracle index 78cfc2ab4932c5e941dc0594a03abefa7c5f14de..e8dcf022daf84c565db6a66afcb2385e4f626f90 100644 --- a/tests/rte/oracle/reqlabl2.res.oracle +++ b/tests/rte/oracle/reqlabl2.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing reqlabl2.c (with preprocessing) -[rte] annotating function g +[rte:annot] annotating function g /* Generated by Frama-C */ /*@ requires PROP_SUR_982: x > 0; requires PROP_SUR_982: x + 1 > 1; diff --git a/tests/rte/oracle/s64.res.oracle b/tests/rte/oracle/s64.res.oracle index 9962e9e0c63ae9cc7fc9591bed6047c38aedb444..e7f45a9c81c24573bddc3591bee716d8a36e6e8a 100644 --- a/tests/rte/oracle/s64.res.oracle +++ b/tests/rte/oracle/s64.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing s64.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] s64.c:9: Warning: guaranteed RTE: assert signed_overflow: 5LL << 63 ≤ 9223372036854775807; /* Generated by Frama-C */ diff --git a/tests/rte/oracle/shift.0.res.oracle b/tests/rte/oracle/shift.0.res.oracle index fac26f0c2c00feb60eb539d4ea0a98ebd2d5b403..2ef426e4e19a108a8c053488182b709d0f18261a 100644 --- a/tests/rte/oracle/shift.0.res.oracle +++ b/tests/rte/oracle/shift.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing shift.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] shift.c:13: Warning: guaranteed RTE: assert signed_overflow: 5 << 30 ≤ 2147483647; [rte] shift.c:14: Warning: diff --git a/tests/rte/oracle/shift.1.res.oracle b/tests/rte/oracle/shift.1.res.oracle index f25446780e5b3c1f991179f9bc1abe0af95e7ad2..71293c7015d4a87f665c47f3ea07a21becad2556 100644 --- a/tests/rte/oracle/shift.1.res.oracle +++ b/tests/rte/oracle/shift.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing shift.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] shift.c:13: Warning: guaranteed RTE: assert signed_overflow: 5 << 30 ≤ 2147483647; [rte] shift.c:14: Warning: diff --git a/tests/rte/oracle/shift_machdep.0.res.oracle b/tests/rte/oracle/shift_machdep.0.res.oracle index c684e70b621f3c2dd96eaefaa49046ae885ce19a..3bccf76f35e0eb3aa36745a0b0d124d5bc324e02 100644 --- a/tests/rte/oracle/shift_machdep.0.res.oracle +++ b/tests/rte/oracle/shift_machdep.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing shift_machdep.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] shift_machdep.c:9: Warning: guaranteed RTE: assert signed_overflow: 5 << 30 ≤ 2147483647; [rte] shift_machdep.c:10: Warning: diff --git a/tests/rte/oracle/shift_machdep.1.res.oracle b/tests/rte/oracle/shift_machdep.1.res.oracle index 271e95d3fef9980adaf9ee1866a562742030aabe..52848785faa85dfdfee1cd126c8ac9141a3d24f7 100644 --- a/tests/rte/oracle/shift_machdep.1.res.oracle +++ b/tests/rte/oracle/shift_machdep.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing shift_machdep.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] shift_machdep.c:9: Warning: guaranteed RTE: assert signed_overflow: 5 << 30 ≤ 2147483647; /* Generated by Frama-C */ diff --git a/tests/rte/oracle/shift_unsigned.0.res.oracle b/tests/rte/oracle/shift_unsigned.0.res.oracle index 919126c899a6914ad07d052b11b12afc0ab41434..3d0738f19d8a66b24b989df75975bed9d113c887 100644 --- a/tests/rte/oracle/shift_unsigned.0.res.oracle +++ b/tests/rte/oracle/shift_unsigned.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing shift_unsigned.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] shift_unsigned.c:11: Warning: guaranteed RTE: assert shift: 0 ≤ (int)(-3) < 32; [rte] shift_unsigned.c:12: Warning: diff --git a/tests/rte/oracle/shift_unsigned.1.res.oracle b/tests/rte/oracle/shift_unsigned.1.res.oracle index 93f591b75aec36523dc821921f0a7a35d20d4e5c..65fef595aa5dc03efcccbcbfb39f0dadf9b95930 100644 --- a/tests/rte/oracle/shift_unsigned.1.res.oracle +++ b/tests/rte/oracle/shift_unsigned.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing shift_unsigned.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [rte] shift_unsigned.c:10: Warning: guaranteed RTE: assert unsigned_overflow: 0x10000000U << 4 ≤ 4294967295; [rte] shift_unsigned.c:11: Warning: diff --git a/tests/rte/oracle/sizeof.res.oracle b/tests/rte/oracle/sizeof.res.oracle index d9b591c01838c896c650280ade7e6c952f9aaa49..dcbe35e009cacb432a529d26caa752135859796b 100644 --- a/tests/rte/oracle/sizeof.res.oracle +++ b/tests/rte/oracle/sizeof.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing sizeof.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(void) { diff --git a/tests/rte/oracle/tab.res.oracle b/tests/rte/oracle/tab.res.oracle index 36efb414b362605a827c204b9763e385b60ba482..d1bf4952e047a91a77b5e3936f14538d5228b1f0 100644 --- a/tests/rte/oracle/tab.res.oracle +++ b/tests/rte/oracle/tab.res.oracle @@ -1,8 +1,8 @@ [kernel] Parsing tab.c (with preprocessing) -[rte] annotating function f4 -[rte] annotating function g4 -[rte] annotating function h4 -[rte] annotating function i4 +[rte:annot] annotating function f4 +[rte:annot] annotating function g4 +[rte:annot] annotating function h4 +[rte:annot] annotating function i4 /* Generated by Frama-C */ typedef double typetab[2]; double g4(typetab *t) diff --git a/tests/rte/oracle/threefunc.res.oracle b/tests/rte/oracle/threefunc.res.oracle index b17bc72a467afba601542f1d32359cd077f5ce8a..d503cbde3115129c5ab80014ba5376bc70d6b5a8 100644 --- a/tests/rte/oracle/threefunc.res.oracle +++ b/tests/rte/oracle/threefunc.res.oracle @@ -68,9 +68,9 @@ int main(void) [kernel] ================================ -[rte] annotating function f -[rte] annotating function g -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function g +[rte:annot] annotating function main /* Generated by Frama-C */ int g(int x, int y) { @@ -230,8 +230,8 @@ int main(void) [kernel] kf = f rte_gen_status = true [kernel] kf = g rte_gen_status = true [kernel] kf = main rte_gen_status = true -[rte] annotating function f -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function main /* Generated by Frama-C */ int g(int x, int y) { diff --git a/tests/rte/oracle/twofunc.res.oracle b/tests/rte/oracle/twofunc.res.oracle index f7a227bd6fe2f82507fba60f47407ea3d7695de0..ec2e7aa894769533265e457e6a9db29a16b5d602 100644 --- a/tests/rte/oracle/twofunc.res.oracle +++ b/tests/rte/oracle/twofunc.res.oracle @@ -59,8 +59,8 @@ int main(void) [kernel] ================================ -[rte] annotating function f -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function main /* Generated by Frama-C */ int f(int x, int y) { diff --git a/tests/rte/oracle/twofunc3.res.oracle b/tests/rte/oracle/twofunc3.res.oracle index 5ba5ff7a353b3b41a67e633aa35c0bf8d9ba1204..8145b8387fff52a03d4b24b89eed580ebbda4a9e 100644 --- a/tests/rte/oracle/twofunc3.res.oracle +++ b/tests/rte/oracle/twofunc3.res.oracle @@ -1,6 +1,6 @@ [kernel] Parsing twofunc3.c (with preprocessing) -[rte] annotating function f -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function main /* Generated by Frama-C */ int f(int x, int y) { diff --git a/tests/rte/oracle/u64.0.res.oracle b/tests/rte/oracle/u64.0.res.oracle index 3d119314fd064d0345bff169e3690c7495aa25e9..60b5b87a4356a025caed762404445f5b37694ef2 100644 --- a/tests/rte/oracle/u64.0.res.oracle +++ b/tests/rte/oracle/u64.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing u64.i (no preprocessing) -[rte] annotating function f +[rte:annot] annotating function f /* Generated by Frama-C */ unsigned long f(unsigned int n) { diff --git a/tests/rte/oracle/u64.1.res.oracle b/tests/rte/oracle/u64.1.res.oracle index 8e3f397dd47b12b29a406d45144a47ba4c9460a2..7b827cd0302e6cc5ed4317b4a41d568e9a45fdff 100644 --- a/tests/rte/oracle/u64.1.res.oracle +++ b/tests/rte/oracle/u64.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing u64.i (no preprocessing) -[rte] annotating function f +[rte:annot] annotating function f /* Generated by Frama-C */ unsigned long f(unsigned int n) { diff --git a/tests/rte/oracle/valid.res.oracle b/tests/rte/oracle/valid.res.oracle index a52448f326b4e52e3c53ed2da56bb6ee101ce5ae..4ecd43c7e72339eccb8c260f022b83584c8c159c 100644 --- a/tests/rte/oracle/valid.res.oracle +++ b/tests/rte/oracle/valid.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing valid.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ struct R { int v ; @@ -199,7 +199,7 @@ int main(void) } -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ struct R { int v ; diff --git a/tests/rte/oracle/value_rte.res.oracle b/tests/rte/oracle/value_rte.res.oracle index f0e668da4a4d0b4be09946158d008f6e17a47b43..929fc1551d0077b7a800819bd47b20c44a4c2620 100644 --- a/tests/rte/oracle/value_rte.res.oracle +++ b/tests/rte/oracle/value_rte.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing value_rte.c (with preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed diff --git a/tests/rte_manual/oracle/bitwise.res.oracle b/tests/rte_manual/oracle/bitwise.res.oracle index 544815c2b1e874ee6ecb2adadf3a2f3c6c623d1d..e6760d6973280c7890daef4ac5096a102bffe519 100644 --- a/tests/rte_manual/oracle/bitwise.res.oracle +++ b/tests/rte_manual/oracle/bitwise.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing bitwise.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(void) { diff --git a/tests/rte_manual/oracle/contract.res.oracle b/tests/rte_manual/oracle/contract.res.oracle index 3cfac7395bf2dc93ef725b3a726e64fc69695e06..61ab777f07378b59f57796e50692e7e682e36921 100644 --- a/tests/rte_manual/oracle/contract.res.oracle +++ b/tests/rte_manual/oracle/contract.res.oracle @@ -1,6 +1,6 @@ [kernel] Parsing contract.i (no preprocessing) -[rte] annotating function f -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function main /* Generated by Frama-C */ /*@ ensures \result ≡ -\old(x); diff --git a/tests/rte_manual/oracle/div.res.oracle b/tests/rte_manual/oracle/div.res.oracle index df7adc017f98c1e2352375018620a29de7c2a1a1..9c30f35bd7a986610bd83beb631964953fb6b389 100644 --- a/tests/rte_manual/oracle/div.res.oracle +++ b/tests/rte_manual/oracle/div.res.oracle @@ -1,6 +1,6 @@ [kernel] Parsing div.i (no preprocessing) -[rte] annotating function f -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function main /* Generated by Frama-C */ void f(void) { diff --git a/tests/rte_manual/oracle/float.res.oracle b/tests/rte_manual/oracle/float.res.oracle index 5737697a89396744b6c2811429a02408ccf9e8eb..0eb2d2a7244fec174f641a8a601440fd8df1b63f 100644 --- a/tests/rte_manual/oracle/float.res.oracle +++ b/tests/rte_manual/oracle/float.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing float.i (no preprocessing) -[rte] annotating function f +[rte:annot] annotating function f /* Generated by Frama-C */ int f(float v) { diff --git a/tests/rte_manual/oracle/machdep.0.res.oracle b/tests/rte_manual/oracle/machdep.0.res.oracle index 3c1069aa8095bf8831926d5274f23c321bd26880..d84215d30228b99aa1db7c1bb7127083d4e0c456 100644 --- a/tests/rte_manual/oracle/machdep.0.res.oracle +++ b/tests/rte_manual/oracle/machdep.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing machdep.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(void) { diff --git a/tests/rte_manual/oracle/machdep.1.res.oracle b/tests/rte_manual/oracle/machdep.1.res.oracle index 74946953da3711d60266a3e191a08363df09fa52..5db9c840ed42d84e9a1028c062ef2abcca45b623 100644 --- a/tests/rte_manual/oracle/machdep.1.res.oracle +++ b/tests/rte_manual/oracle/machdep.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing machdep.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(void) { diff --git a/tests/rte_manual/oracle/memaccess.res.oracle b/tests/rte_manual/oracle/memaccess.res.oracle index 1ba252075fb0c7bbcebc294802915d0b563a8fa5..1ca686c508ea9e99f381f4f564fef7f23a08b92b 100644 --- a/tests/rte_manual/oracle/memaccess.res.oracle +++ b/tests/rte_manual/oracle/memaccess.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing memaccess.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int i; unsigned int j; diff --git a/tests/rte_manual/oracle/safearrays.res.oracle b/tests/rte_manual/oracle/safearrays.res.oracle index d0e564f54450238f72df9a33e55ef7eeac0eca7f..b982303c294a0067c75255af09d18737e0f28d0e 100644 --- a/tests/rte_manual/oracle/safearrays.res.oracle +++ b/tests/rte_manual/oracle/safearrays.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing safearrays.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ struct S { int val ; diff --git a/tests/rte_manual/oracle/signed_downcast.0.res.oracle b/tests/rte_manual/oracle/signed_downcast.0.res.oracle index 1b702b574aaceec554254bc80db4d4add37e4279..3f02e092cbed16d35c7888b0d15f0224312c95f5 100644 --- a/tests/rte_manual/oracle/signed_downcast.0.res.oracle +++ b/tests/rte_manual/oracle/signed_downcast.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing signed_downcast.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(void) { diff --git a/tests/rte_manual/oracle/signed_downcast.1.res.oracle b/tests/rte_manual/oracle/signed_downcast.1.res.oracle index f1ac2e75441bdaa1946970b2dc8c5c11e3bea979..802d1a3345d1ee0dd3580278c62f81c18c1850be 100644 --- a/tests/rte_manual/oracle/signed_downcast.1.res.oracle +++ b/tests/rte_manual/oracle/signed_downcast.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing signed_downcast.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(void) { diff --git a/tests/rte_manual/oracle/unary_minus.res.oracle b/tests/rte_manual/oracle/unary_minus.res.oracle index 56c6a3b2ab69186e711315890227edcd7f667498..447788fa86b93e91d22d1c0c5d593edbf072e301 100644 --- a/tests/rte_manual/oracle/unary_minus.res.oracle +++ b/tests/rte_manual/oracle/unary_minus.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing unary_minus.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ int main(void) { diff --git a/tests/rte_manual/oracle/unsigned.0.res.oracle b/tests/rte_manual/oracle/unsigned.0.res.oracle index d5516362ef8f1d8c13e4e101c3b3927db066164a..533f554133cc5501a14980a55f2b181e008689ab 100644 --- a/tests/rte_manual/oracle/unsigned.0.res.oracle +++ b/tests/rte_manual/oracle/unsigned.0.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing unsigned.i (no preprocessing) -[rte] annotating function f +[rte:annot] annotating function f /* Generated by Frama-C */ unsigned int f(unsigned int a, unsigned int b) { diff --git a/tests/rte_manual/oracle/unsigned.1.res.oracle b/tests/rte_manual/oracle/unsigned.1.res.oracle index 1c752a84252eb6a372d5f442069f406ed9eda340..60fae9d9db15dad80b26d4298d4e43f64fd56853 100644 --- a/tests/rte_manual/oracle/unsigned.1.res.oracle +++ b/tests/rte_manual/oracle/unsigned.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing unsigned.i (no preprocessing) -[rte] annotating function f +[rte:annot] annotating function f /* Generated by Frama-C */ unsigned int f(unsigned int a, unsigned int b) { diff --git a/tests/rte_manual/oracle/unsigned_downcast.res.oracle b/tests/rte_manual/oracle/unsigned_downcast.res.oracle index b8f476d5ae7de334235015af441040671c7a20e6..3b440cc2743cb396018f94441b2f8b990ebe1daf 100644 --- a/tests/rte_manual/oracle/unsigned_downcast.res.oracle +++ b/tests/rte_manual/oracle/unsigned_downcast.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing unsigned_downcast.i (no preprocessing) -[rte] annotating function f +[rte:annot] annotating function f /* Generated by Frama-C */ unsigned char f(int a, int b) { diff --git a/tests/saveload/basic.i b/tests/saveload/basic.i index 96e934171473758e5b70f373733d4c78325ab754..bde889f55cfc6d8ecfe71eb05717619cd3067fac 100644 --- a/tests/saveload/basic.i +++ b/tests/saveload/basic.i @@ -1,18 +1,20 @@ /* run.config + COMMENT: the following CMD redefinition omits adding @PTEST_FILE@ on purpose (due to -load) + CMD: @frama-c@ @PTEST_OPTIONS@ MODULE: @PTEST_NAME@ - EXECNOW: LOG basic_sav.res LOG basic_sav.err BIN basic.sav @frama-c@ -eva @EVA_OPTIONS@ -out -input -deps @PTEST_FILE@ -save @PTEST_RESULT@/basic.sav > @PTEST_RESULT@/basic_sav.res 2> @PTEST_RESULT@/basic_sav.err + EXECNOW: BIN @PTEST_NAME@.sav LOG @PTEST_NAME@_sav.res LOG @PTEST_NAME@_sav.err @frama-c@ -eva @EVA_OPTIONS@ -out -input -deps @PTEST_FILE@ -save @PTEST_NAME@.sav > @PTEST_NAME@_sav.res 2> @PTEST_NAME@_sav.err MODULE: - EXECNOW: LOG basic_sav.1.res LOG basic_sav.1.err BIN basic.1.sav @frama-c@ -save @PTEST_RESULT@/basic.1.sav @PTEST_FILE@ -eva @EVA_OPTIONS@ -out -input -deps > @PTEST_RESULT@/basic_sav.1.res 2> @PTEST_RESULT@/basic_sav.1.err - STDOPT: +"-load %{dep:@PTEST_RESULT@/basic.sav} -eva @EVA_OPTIONS@ -out -input -deps" + EXECNOW: BIN @PTEST_NAME@.1.sav LOG @PTEST_NAME@_sav.1.res LOG @PTEST_NAME@_sav.1.err @frama-c@ -save @PTEST_NAME@.1.sav @PTEST_FILE@ -eva @EVA_OPTIONS@ -out -input -deps > @PTEST_NAME@_sav.1.res 2> @PTEST_NAME@_sav.1.err + STDOPT: +"-load %{dep:@PTEST_NAME@.sav} -eva @EVA_OPTIONS@ -out -input -deps" MODULE: @PTEST_NAME@ - STDOPT: +"-load %{dep:@PTEST_RESULT@/basic.1}.sav -eva @EVA_OPTIONS@ -out -input -deps -print" + STDOPT: +"-load %{dep:@PTEST_NAME@.1}.sav -eva @EVA_OPTIONS@ -out -input -deps -print" MODULE: - STDOPT: +"-load %{dep:@PTEST_RESULT@/basic.1}.sav -eva @EVA_OPTIONS@ -out -input -deps" + STDOPT: +"-load %{dep:@PTEST_NAME@.1}.sav -eva @EVA_OPTIONS@ -out -input -deps" MODULE: status - EXECNOW: LOG status_sav.res LOG status_sav.err BIN status.sav @frama-c@ -save @PTEST_RESULT@/status.sav @PTEST_FILE@ > @PTEST_RESULT@/status_sav.res 2> @PTEST_RESULT@/status_sav.err - STDOPT: +"-load %{dep:@PTEST_RESULT@/status.sav}" + EXECNOW: LOG status_sav.res LOG status_sav.err BIN status.sav @frama-c@ -save status.sav @PTEST_FILE@ > status_sav.res 2> status_sav.err + STDOPT: +"-load %{dep:status.sav}" MODULE: - STDOPT: +"-load %{dep:@PTEST_RESULT@/status.sav}" + STDOPT: +"-load %{dep:status.sav}" */ int main() { int i,j; i=10; /*@ assert (i == 10); */ diff --git a/tests/saveload/bool.c b/tests/saveload/bool.c index ee02ead4e9d496c0b0df6b584b6454ca770acc57..0761e1802e7b7a271b73e76e97294db78f8ec878 100644 --- a/tests/saveload/bool.c +++ b/tests/saveload/bool.c @@ -1,7 +1,9 @@ /* run.config - EXECNOW: BIN bool.sav LOG bool_sav.res LOG bool_sav.err @frama-c@ -save @PTEST_RESULT@/bool.sav -machdep x86_32 -eva @EVA_OPTIONS@ %{dep:@PTEST_DIR@/bool.c} > @PTEST_RESULT@/bool_sav.res 2> @PTEST_RESULT@/bool_sav.err - STDOPT: +"-load %{dep:@PTEST_RESULT@/bool.sav} -out -input -deps" - STDOPT: +"-load %{dep:@PTEST_RESULT@/bool.sav} -eva @EVA_OPTIONS@" + COMMENT: the following CMD redefinition omits adding @PTEST_FILE@ on purpose (due to -load) + CMD: @frama-c@ @PTEST_OPTIONS@ + EXECNOW: BIN @PTEST_NAME@.sav LOG @PTEST_NAME@_sav.res LOG @PTEST_NAME@_sav.err @frama-c@ -save @PTEST_NAME@.sav -machdep x86_32 -eva @EVA_OPTIONS@ @PTEST_FILE@ > @PTEST_NAME@_sav.res 2> @PTEST_NAME@_sav.err + STDOPT: +"-load %{dep:@PTEST_NAME@.sav} -out -input -deps" + STDOPT: +"-load %{dep:@PTEST_NAME@.sav} -eva @EVA_OPTIONS@" */ #include "stdbool.h" diff --git a/tests/saveload/callbacks.i b/tests/saveload/callbacks.i index 5d0b112d238d1c3f9fb76ecef4492e95d051f47f..0d972cf7c43012e3b243be20b5924529606fd2ce 100644 --- a/tests/saveload/callbacks.i +++ b/tests/saveload/callbacks.i @@ -1,6 +1,8 @@ /* run.config - EXECNOW: LOG callbacks_initial.res LOG callbacks_initial.err BIN callbacks.sav @frama-c@ %{dep:@PTEST_DIR@/callbacks.i} -out -calldeps -eva-show-progress -main main1 -save @PTEST_RESULT@/callbacks.sav > @PTEST_RESULT@/callbacks_initial.res 2> @PTEST_RESULT@/callbacks_initial.err - STDOPT: +"-load %{dep:@PTEST_RESULT@/callbacks.sav} -main main2 -then -main main3" + COMMENT: the following CMD redefinition omits adding @PTEST_FILE@ on purpose (due to -load) + CMD: @frama-c@ @PTEST_OPTIONS@ + EXECNOW: BIN @PTEST_NAME@.sav LOG @PTEST_NAME@_sav.res LOG @PTEST_NAME@_sav.err @frama-c@ @PTEST_FILE@ -out -calldeps -eva-show-progress -main main1 -save @PTEST_NAME@.sav > @PTEST_NAME@_sav.res 2> @PTEST_NAME@_sav.err + STDOPT: +"-load %{dep:@PTEST_NAME@.sav} -main main2 -then -main main3" */ /* This tests whether the callbacks for callwise inout and from survive after diff --git a/tests/saveload/deps.i b/tests/saveload/deps.i index 633c19718ec97a731deb96a7354f64763379b5ba..789392c738d76ac3426b0c1a52b386df8dacedab 100644 --- a/tests/saveload/deps.i +++ b/tests/saveload/deps.i @@ -1,15 +1,17 @@ /* run.config + COMMENT: the following CMD redefinition omits adding @PTEST_FILE@ on purpose (due to -load) + CMD: @frama-c@ @PTEST_OPTIONS@ MODULE: deps_A - EXECNOW: LOG deps_sav.res LOG deps_sav.err BIN deps.sav @frama-c@ -eva @EVA_OPTIONS@ -out -input -deps @PTEST_FILE@ -save @PTEST_RESULT@/deps.sav > @PTEST_RESULT@/deps_sav.res 2> @PTEST_RESULT@/deps_sav.err - STDOPT: +"-load %{dep:@PTEST_RESULT@/deps.sav} -eva @EVA_OPTIONS@ -out -input -deps " + EXECNOW: BIN @PTEST_NAME@.sav LOG @PTEST_NAME@_sav.res LOG @PTEST_NAME@_sav.err @frama-c@ -eva @EVA_OPTIONS@ -out -input -deps @PTEST_FILE@ -save @PTEST_NAME@.sav > @PTEST_NAME@_sav.res 2> @PTEST_NAME@_sav.err + STDOPT: +"-load %{dep:@PTEST_NAME@.sav} -eva @EVA_OPTIONS@ -out -input -deps " MODULE: deps_B - STDOPT: +"-load %{dep:@PTEST_RESULT@/deps.sav} -out -input -deps " + STDOPT: +"-load %{dep:@PTEST_NAME@.sav} -out -input -deps " MODULE: deps_C - STDOPT: +"-load %{dep:@PTEST_RESULT@/deps.sav} -out -input -deps " + STDOPT: +"-load %{dep:@PTEST_NAME@.sav} -out -input -deps " MODULE: deps_D - STDOPT: +"-load %{dep:@PTEST_RESULT@/deps.sav} -out -input -deps " + STDOPT: +"-load %{dep:@PTEST_NAME@.sav} -out -input -deps " MODULE: deps_E - STDOPT: +"-load %{dep:@PTEST_RESULT@/deps.sav} -out -input -deps " + STDOPT: +"-load %{dep:@PTEST_NAME@.sav} -out -input -deps " */ int main() { diff --git a/tests/saveload/isset.c b/tests/saveload/isset.c index ebbce985577b02a719fafbf360c4f5bb05a3ce7c..67cbc12b5c2ce7a8a3008651ec0fc755487d212c 100644 --- a/tests/saveload/isset.c +++ b/tests/saveload/isset.c @@ -1,9 +1,11 @@ /* run.config - EXECNOW: LOG isset_sav.res LOG isset_sav.err BIN isset.sav @frama-c@ -quiet -eva @EVA_OPTIONS@ -save @PTEST_RESULT@/isset.sav %{dep:@PTEST_DIR@/isset.c} > @PTEST_RESULT@/isset_sav.res 2> @PTEST_RESULT@/isset_sav.err - STDOPT: +"-quiet -load %{dep:@PTEST_RESULT@/isset.sav}" - STDOPT: +"-load %{dep:@PTEST_RESULT@/isset.sav}" - STDOPT: +"-eva @EVA_OPTIONS@ -load %{dep:@PTEST_RESULT@/isset.sav}" - STDOPT: +"-quiet -eva @EVA_OPTIONS@ -load %{dep:@PTEST_RESULT@/isset.sav}" + COMMENT: the following CMD redefinition omits adding @PTEST_FILE@ on purpose (due to -load) + CMD: @frama-c@ @PTEST_OPTIONS@ + EXECNOW: BIN @PTEST_NAME@.sav LOG @PTEST_NAME@_sav.res LOG @PTEST_NAME@_sav.err @frama-c@ -quiet -eva @EVA_OPTIONS@ -save @PTEST_NAME@.sav @PTEST_FILE@ > @PTEST_NAME@_sav.res 2> @PTEST_NAME@_sav.err + STDOPT: +"-quiet -load %{dep:@PTEST_NAME@.sav}" + STDOPT: +"-load %{dep:@PTEST_NAME@.sav}" + STDOPT: +"-eva @EVA_OPTIONS@ -load %{dep:@PTEST_NAME@.sav}" + STDOPT: +"-quiet -eva @EVA_OPTIONS@ -load %{dep:@PTEST_NAME@.sav}" */ int main() { diff --git a/tests/saveload/multi_project.i b/tests/saveload/multi_project.i index ec08de1fdb456c2aa77a3902568c09ff6513a32e..3c679630551fca3e0eb5c992804d9149439ffcee 100644 --- a/tests/saveload/multi_project.i +++ b/tests/saveload/multi_project.i @@ -1,7 +1,7 @@ /* run.config PLUGIN: @EVA_PLUGINS@ constant_propagation - EXECNOW: BIN multi_project.sav LOG multi_project_sav.res LOG multi_project_sav.err @frama-c@ -save @PTEST_RESULT@/multi_project.sav @EVA_OPTIONS@ -semantic-const-folding @PTEST_DIR@/@PTEST_NAME@.i > @PTEST_RESULT@/multi_project_sav.res 2> @PTEST_RESULT@/multi_project_sav.err - STDOPT: +"-load %{dep:@PTEST_RESULT@/multi_project.sav}" + EXECNOW: BIN @PTEST_NAME@.sav LOG @PTEST_NAME@_sav.res LOG @PTEST_NAME@_sav.err @frama-c@ -save @PTEST_NAME@.sav @EVA_OPTIONS@ -semantic-const-folding @PTEST_FILE@ > @PTEST_NAME@_sav.res 2> @PTEST_NAME@_sav.err + STDOPT: +"-load %{dep:@PTEST_NAME@.sav}" MODULE: @PTEST_NAME@ OPT: -eva @EVA_OPTIONS@ */ diff --git a/tests/saveload/oracle/basic.0.res.oracle b/tests/saveload/oracle/basic.0.res.oracle index 919ad3e4907c1f8e2bf010459d184911758aec0d..0fe986b70a1ed12971d4f09a2d440bb47f152d5f 100644 --- a/tests/saveload/oracle/basic.0.res.oracle +++ b/tests/saveload/oracle/basic.0.res.oracle @@ -1,2 +1 @@ [kernel] Warning: 1 state in saved file ignored. It is invalid in this Frama-C configuration. -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/basic.1.res.oracle b/tests/saveload/oracle/basic.1.res.oracle index 2cf7ada66893ceb8fffd9b80ab2095c00320d0ee..00d6006f60617db5b874f2f3e311887a8ae9347a 100644 --- a/tests/saveload/oracle/basic.1.res.oracle +++ b/tests/saveload/oracle/basic.1.res.oracle @@ -1,4 +1,3 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. /* Generated by Frama-C */ int main(void) { diff --git a/tests/saveload/oracle/basic.2.res.oracle b/tests/saveload/oracle/basic.2.res.oracle deleted file mode 100644 index c1a75f49e233a3557ccc3efb28c191b714eaa1d5..0000000000000000000000000000000000000000 --- a/tests/saveload/oracle/basic.2.res.oracle +++ /dev/null @@ -1 +0,0 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/basic.3.res.oracle b/tests/saveload/oracle/basic.3.res.oracle index 16968dd0a24898734984c5fc918d12e7491fdd88..05d31773bf3f042e9f9b748cc546aaca05ad6872 100644 --- a/tests/saveload/oracle/basic.3.res.oracle +++ b/tests/saveload/oracle/basic.3.res.oracle @@ -1,2 +1 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. unknown (tried by Test) diff --git a/tests/saveload/oracle/basic.4.res.oracle b/tests/saveload/oracle/basic.4.res.oracle index 047acff3e8d77ced0f676b1de446cdbbe0c91952..7452402948f0fad8d57c67cc0b5465f130d5c22a 100644 --- a/tests/saveload/oracle/basic.4.res.oracle +++ b/tests/saveload/oracle/basic.4.res.oracle @@ -1,2 +1 @@ [kernel] Warning: 11 states in saved file ignored. They are invalid in this Frama-C configuration. -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/basic_sav.1.res b/tests/saveload/oracle/basic_sav.1.res index 2d8d381c7cbfedc39e3f5d60bcde3cd09134cc17..8e9fab3900539a0111c80c9798d86efeb94bd94a 100644 --- a/tests/saveload/oracle/basic_sav.1.res +++ b/tests/saveload/oracle/basic_sav.1.res @@ -4,9 +4,9 @@ [eva] Initial state computed [eva:initial-state] Values of globals at initialization -[eva] basic.i:18: assertion got status valid. -[eva] basic.i:19: starting to merge loop iterations -[eva:alarm] basic.i:19: Warning: signed overflow. assert -2147483648 ≤ i - 1; +[eva] basic.i:20: assertion got status valid. +[eva] basic.i:21: starting to merge loop iterations +[eva:alarm] basic.i:21: Warning: signed overflow. assert -2147483648 ≤ i - 1; [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== diff --git a/tests/saveload/oracle/basic_sav.res b/tests/saveload/oracle/basic_sav.res index 2d8d381c7cbfedc39e3f5d60bcde3cd09134cc17..8e9fab3900539a0111c80c9798d86efeb94bd94a 100644 --- a/tests/saveload/oracle/basic_sav.res +++ b/tests/saveload/oracle/basic_sav.res @@ -4,9 +4,9 @@ [eva] Initial state computed [eva:initial-state] Values of globals at initialization -[eva] basic.i:18: assertion got status valid. -[eva] basic.i:19: starting to merge loop iterations -[eva:alarm] basic.i:19: Warning: signed overflow. assert -2147483648 ≤ i - 1; +[eva] basic.i:20: assertion got status valid. +[eva] basic.i:21: starting to merge loop iterations +[eva:alarm] basic.i:21: Warning: signed overflow. assert -2147483648 ≤ i - 1; [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== diff --git a/tests/saveload/oracle/bool.0.res.oracle b/tests/saveload/oracle/bool.0.res.oracle index f2e7096002831c02bbf21281a4c13821581bb843..d193e342d69221b4cb1adb9cae3f0f96141e6d86 100644 --- a/tests/saveload/oracle/bool.0.res.oracle +++ b/tests/saveload/oracle/bool.0.res.oracle @@ -1,4 +1,3 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. [from] Computing for function f [from] Done for function f [from] Computing for function main diff --git a/tests/saveload/oracle/bool.1.res.oracle b/tests/saveload/oracle/bool.1.res.oracle deleted file mode 100644 index c1a75f49e233a3557ccc3efb28c191b714eaa1d5..0000000000000000000000000000000000000000 --- a/tests/saveload/oracle/bool.1.res.oracle +++ /dev/null @@ -1 +0,0 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/bool_sav.res b/tests/saveload/oracle/bool_sav.res index 7a24197dd13a11b3d32faf881abf47700079f65b..b05786274e09835b0456d757bbf858d4da3ef511 100644 --- a/tests/saveload/oracle/bool_sav.res +++ b/tests/saveload/oracle/bool_sav.res @@ -6,36 +6,36 @@ x ∈ {0} y ∈ {0} [eva] computing for function f <- main. - Called from bool.c:25. -[eva] bool.c:17: assertion got status valid. -[eva] bool.c:18: starting to merge loop iterations -[eva:alarm] bool.c:18: Warning: signed overflow. assert -2147483648 ≤ i - 1; + Called from bool.c:27. +[eva] bool.c:19: assertion got status valid. +[eva] bool.c:20: starting to merge loop iterations +[eva:alarm] bool.c:20: Warning: signed overflow. assert -2147483648 ≤ i - 1; [eva] Recording results for f [eva] Done for function f [eva] computing for function printf_va_1 <- main. - Called from bool.c:27. + Called from bool.c:29. [eva] using specification for function printf_va_1 -[eva] bool.c:27: function printf_va_1: precondition got status valid. +[eva] bool.c:29: function printf_va_1: precondition got status valid. [eva] Done for function printf_va_1 [eva] computing for function printf_va_2 <- main. - Called from bool.c:29. + Called from bool.c:31. [eva] using specification for function printf_va_2 -[eva] bool.c:29: function printf_va_2: precondition got status valid. +[eva] bool.c:31: function printf_va_2: precondition got status valid. [eva] Done for function printf_va_2 [eva] computing for function printf_va_3 <- main. - Called from bool.c:31. + Called from bool.c:33. [eva] using specification for function printf_va_3 -[eva] bool.c:31: function printf_va_3: precondition got status valid. +[eva] bool.c:33: function printf_va_3: precondition got status valid. [eva] Done for function printf_va_3 [eva] computing for function printf_va_4 <- main. - Called from bool.c:33. + Called from bool.c:35. [eva] using specification for function printf_va_4 -[eva] bool.c:33: function printf_va_4: precondition got status valid. +[eva] bool.c:35: function printf_va_4: precondition got status valid. [eva] Done for function printf_va_4 [eva] computing for function printf_va_5 <- main. - Called from bool.c:35. + Called from bool.c:37. [eva] using specification for function printf_va_5 -[eva] bool.c:35: function printf_va_5: precondition got status valid. +[eva] bool.c:37: function printf_va_5: precondition got status valid. [eva] Done for function printf_va_5 [eva] Recording results for main [eva] done for function main diff --git a/tests/saveload/oracle/callbacks.res.oracle b/tests/saveload/oracle/callbacks.res.oracle index ae9563d2b2b8ce582d84ca2bef1b6bd3dd9006f3..60b806b01fc1701f826f5a5ec33e94ebbe870ef4 100644 --- a/tests/saveload/oracle/callbacks.res.oracle +++ b/tests/saveload/oracle/callbacks.res.oracle @@ -1,4 +1,3 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. [eva] Analyzing a complete application starting at main2 [eva] Computing initial state [eva] Initial state computed @@ -6,9 +5,9 @@ x ∈ {0} y ∈ {0} [eva] computing for function g1 <- main2. - Called from callbacks.i:30. + Called from callbacks.i:32. [eva] computing for function f <- g1 <- main2. - Called from callbacks.i:16. + Called from callbacks.i:18. [eva] Recording results for f [from] Computing for function f [from] Done for function f @@ -18,9 +17,9 @@ [from] Done for function g1 [eva] Done for function g1 [eva] computing for function g2 <- main2. - Called from callbacks.i:31. + Called from callbacks.i:33. [eva] computing for function f <- g2 <- main2. - Called from callbacks.i:21. + Called from callbacks.i:23. [eva] Recording results for f [from] Computing for function f [from] Done for function f @@ -34,13 +33,13 @@ [from] Done for function main2 [eva] done for function main2 [from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== -[from] call to f at callbacks.i:16 (by g1): +[from] call to f at callbacks.i:18 (by g1): x FROM p -[from] call to f at callbacks.i:21 (by g2): +[from] call to f at callbacks.i:23 (by g2): y FROM p -[from] call to g1 at callbacks.i:30 (by main2): +[from] call to g1 at callbacks.i:32 (by main2): x FROM \nothing -[from] call to g2 at callbacks.i:31 (by main2): +[from] call to g2 at callbacks.i:33 (by main2): y FROM \nothing [from] entry point: x FROM \nothing @@ -61,9 +60,9 @@ x ∈ {0} y ∈ {0} [eva] computing for function g1 <- main3. - Called from callbacks.i:35. + Called from callbacks.i:37. [eva] computing for function f <- g1 <- main3. - Called from callbacks.i:16. + Called from callbacks.i:18. [eva] Recording results for f [from] Computing for function f [from] Done for function f @@ -73,9 +72,9 @@ [from] Done for function g1 [eva] Done for function g1 [eva] computing for function g2 <- main3. - Called from callbacks.i:36. + Called from callbacks.i:38. [eva] computing for function f <- g2 <- main3. - Called from callbacks.i:21. + Called from callbacks.i:23. [eva] Recording results for f [from] Computing for function f [from] Done for function f @@ -89,13 +88,13 @@ [from] Done for function main3 [eva] done for function main3 [from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== -[from] call to f at callbacks.i:16 (by g1): +[from] call to f at callbacks.i:18 (by g1): x FROM p -[from] call to f at callbacks.i:21 (by g2): +[from] call to f at callbacks.i:23 (by g2): y FROM p -[from] call to g1 at callbacks.i:35 (by main3): +[from] call to g1 at callbacks.i:37 (by main3): x FROM \nothing -[from] call to g2 at callbacks.i:36 (by main3): +[from] call to g2 at callbacks.i:38 (by main3): y FROM \nothing [from] entry point: x FROM \nothing diff --git a/tests/saveload/oracle/callbacks_sav.err b/tests/saveload/oracle/callbacks_sav.err new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/saveload/oracle/callbacks_initial.res b/tests/saveload/oracle/callbacks_sav.res similarity index 87% rename from tests/saveload/oracle/callbacks_initial.res rename to tests/saveload/oracle/callbacks_sav.res index 9e942d99e7f83b4e5f7643cffc474c9c39d2e506..294a67f3fe59243bedc5da3aebccce7995d75f20 100644 --- a/tests/saveload/oracle/callbacks_initial.res +++ b/tests/saveload/oracle/callbacks_sav.res @@ -6,9 +6,9 @@ x ∈ {0} y ∈ {0} [eva] computing for function g1 <- main1. - Called from callbacks.i:25. + Called from callbacks.i:27. [eva] computing for function f <- g1 <- main1. - Called from callbacks.i:16. + Called from callbacks.i:18. [eva] Recording results for f [from] Computing for function f [from] Done for function f @@ -18,9 +18,9 @@ [from] Done for function g1 [eva] Done for function g1 [eva] computing for function g2 <- main1. - Called from callbacks.i:26. + Called from callbacks.i:28. [eva] computing for function f <- g2 <- main1. - Called from callbacks.i:21. + Called from callbacks.i:23. [eva] Recording results for f [from] Computing for function f [from] Done for function f @@ -45,13 +45,13 @@ No logical properties have been reached by the analysis. ---------------------------------------------------------------------------- [from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== -[from] call to f at callbacks.i:16 (by g1): +[from] call to f at callbacks.i:18 (by g1): x FROM p -[from] call to f at callbacks.i:21 (by g2): +[from] call to f at callbacks.i:23 (by g2): y FROM p -[from] call to g1 at callbacks.i:25 (by main1): +[from] call to g1 at callbacks.i:27 (by main1): x FROM \nothing -[from] call to g2 at callbacks.i:26 (by main1): +[from] call to g2 at callbacks.i:28 (by main1): y FROM \nothing [from] entry point: x FROM \nothing diff --git a/tests/saveload/oracle/deps.0.res.oracle b/tests/saveload/oracle/deps.0.res.oracle deleted file mode 100644 index c1a75f49e233a3557ccc3efb28c191b714eaa1d5..0000000000000000000000000000000000000000 --- a/tests/saveload/oracle/deps.0.res.oracle +++ /dev/null @@ -1 +0,0 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/deps.1.res.oracle b/tests/saveload/oracle/deps.1.res.oracle index 525368b91402446b298d0242a20cdb75dbd4b268..86d7a2aa4ea6852ffe77c514b82169f16a040c6d 100644 --- a/tests/saveload/oracle/deps.1.res.oracle +++ b/tests/saveload/oracle/deps.1.res.oracle @@ -1,2 +1 @@ [kernel] Warning: 2 states in saved file ignored. They are invalid in this Frama-C configuration. -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/deps.3.res.oracle b/tests/saveload/oracle/deps.3.res.oracle deleted file mode 100644 index c1a75f49e233a3557ccc3efb28c191b714eaa1d5..0000000000000000000000000000000000000000 --- a/tests/saveload/oracle/deps.3.res.oracle +++ /dev/null @@ -1 +0,0 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/deps.4.res.oracle b/tests/saveload/oracle/deps.4.res.oracle index d1126cce5b44973d2f40b213658d3d4be094f7e3..0ace314a020f9c99ef7b61fbdaab5789416dcfd4 100644 --- a/tests/saveload/oracle/deps.4.res.oracle +++ b/tests/saveload/oracle/deps.4.res.oracle @@ -1,3 +1,2 @@ [kernel] Warning: 1 state in saved file ignored. It is invalid in this Frama-C configuration. [kernel] Warning: 1 state in memory reset to their default value. It is inconsistent in this Frama_C configuration. -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/deps_sav.res b/tests/saveload/oracle/deps_sav.res index 103d5a3540df28ec7894e9cec410ffc4e6c8097e..516b5aaa9c355dd58ac0dba9a1de29d2dfa1fdc3 100644 --- a/tests/saveload/oracle/deps_sav.res +++ b/tests/saveload/oracle/deps_sav.res @@ -4,8 +4,8 @@ [eva] Initial state computed [eva:initial-state] Values of globals at initialization -[eva] deps.i:19: starting to merge loop iterations -[eva:alarm] deps.i:19: Warning: signed overflow. assert -2147483648 ≤ i - 1; +[eva] deps.i:21: starting to merge loop iterations +[eva:alarm] deps.i:21: Warning: signed overflow. assert -2147483648 ≤ i - 1; [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== diff --git a/tests/saveload/oracle/isset.0.res.oracle b/tests/saveload/oracle/isset.0.res.oracle deleted file mode 100644 index c1a75f49e233a3557ccc3efb28c191b714eaa1d5..0000000000000000000000000000000000000000 --- a/tests/saveload/oracle/isset.0.res.oracle +++ /dev/null @@ -1 +0,0 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/isset.1.res.oracle b/tests/saveload/oracle/isset.1.res.oracle deleted file mode 100644 index c1a75f49e233a3557ccc3efb28c191b714eaa1d5..0000000000000000000000000000000000000000 --- a/tests/saveload/oracle/isset.1.res.oracle +++ /dev/null @@ -1 +0,0 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/isset.2.res.oracle b/tests/saveload/oracle/isset.2.res.oracle deleted file mode 100644 index c1a75f49e233a3557ccc3efb28c191b714eaa1d5..0000000000000000000000000000000000000000 --- a/tests/saveload/oracle/isset.2.res.oracle +++ /dev/null @@ -1 +0,0 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/isset.3.res.oracle b/tests/saveload/oracle/isset.3.res.oracle deleted file mode 100644 index c1a75f49e233a3557ccc3efb28c191b714eaa1d5..0000000000000000000000000000000000000000 --- a/tests/saveload/oracle/isset.3.res.oracle +++ /dev/null @@ -1 +0,0 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/isset_sav.res b/tests/saveload/oracle/isset_sav.res index f2693a09a703f2ac60abde786ce875d8b5aaf428..6c37866d4873f65d073c1ddd5e8e2809474c9090 100644 --- a/tests/saveload/oracle/isset_sav.res +++ b/tests/saveload/oracle/isset_sav.res @@ -1 +1 @@ -[eva:alarm] isset.c:13: Warning: signed overflow. assert -2147483648 ≤ i - 1; +[eva:alarm] isset.c:15: Warning: signed overflow. assert -2147483648 ≤ i - 1; diff --git a/tests/saveload/oracle/segfault_datatypes.res.oracle b/tests/saveload/oracle/segfault_datatypes.res.oracle index 919ad3e4907c1f8e2bf010459d184911758aec0d..0fe986b70a1ed12971d4f09a2d440bb47f152d5f 100644 --- a/tests/saveload/oracle/segfault_datatypes.res.oracle +++ b/tests/saveload/oracle/segfault_datatypes.res.oracle @@ -1,2 +1 @@ [kernel] Warning: 1 state in saved file ignored. It is invalid in this Frama-C configuration. -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/segfault_datatypes_sav.res b/tests/saveload/oracle/segfault_datatypes_sav.res index 3aece07549bce1d601a9775123b3ace2d2ebade7..773e46ed9de6a9b8d046630df082ddc385da9d94 100644 --- a/tests/saveload/oracle/segfault_datatypes_sav.res +++ b/tests/saveload/oracle/segfault_datatypes_sav.res @@ -4,8 +4,8 @@ [eva] Initial state computed [eva:initial-state] Values of globals at initialization -[eva] segfault_datatypes.i:12: starting to merge loop iterations -[eva:alarm] segfault_datatypes.i:12: Warning: +[eva] segfault_datatypes.i:14: starting to merge loop iterations +[eva:alarm] segfault_datatypes.i:14: Warning: signed overflow. assert -2147483648 ≤ i - 1; [eva] Recording results for main [eva] done for function main diff --git a/tests/saveload/oracle/sparecode.res.oracle b/tests/saveload/oracle/sparecode.res.oracle deleted file mode 100644 index c1a75f49e233a3557ccc3efb28c191b714eaa1d5..0000000000000000000000000000000000000000 --- a/tests/saveload/oracle/sparecode.res.oracle +++ /dev/null @@ -1 +0,0 @@ -[kernel] Warning: ignoring source files specified on the command line while loading a global initial context. diff --git a/tests/saveload/oracle/sparecode_sav.res b/tests/saveload/oracle/sparecode_sav.res index 36b458ce885011f637ab5b5355569f1ac10771fb..7f7224a92580a85386ee8d10c43884311124310e 100644 --- a/tests/saveload/oracle/sparecode_sav.res +++ b/tests/saveload/oracle/sparecode_sav.res @@ -6,15 +6,15 @@ [eva:initial-state] Values of globals at initialization G ∈ {0} [eva] computing for function f <- main. - Called from sparecode.i:16. + Called from sparecode.i:18. [eva] Recording results for f [eva] Done for function f [eva] computing for function f <- main. - Called from sparecode.i:17. + Called from sparecode.i:19. [eva] Recording results for f [eva] Done for function f [eva] computing for function f <- main. - Called from sparecode.i:18. + Called from sparecode.i:20. [eva] Recording results for f [eva] Done for function f [eva] Recording results for main diff --git a/tests/saveload/segfault_datatypes.i b/tests/saveload/segfault_datatypes.i index 128453345c41c009c35b09b4ac912e801942a281..f82aa25d3410704ed3a717f9081d97288d5a5569 100644 --- a/tests/saveload/segfault_datatypes.i +++ b/tests/saveload/segfault_datatypes.i @@ -1,8 +1,10 @@ /* run.config* + COMMENT: the following CMD redefinition omits adding @PTEST_FILE@ on purpose (due to -load) + CMD: @frama-c@ @PTEST_OPTIONS@ MODULE: segfault_datatypes_A - EXECNOW: LOG segfault_datatypes_sav.res LOG segfault_datatypes_sav.err BIN segfault_datatypes.sav @frama-c@ -eva @EVA_OPTIONS@ -out -input -deps @PTEST_FILE@ -save @PTEST_RESULT@/segfault_datatypes.sav > @PTEST_RESULT@/segfault_datatypes_sav.res 2> @PTEST_RESULT@/segfault_datatypes_sav.err + EXECNOW: BIN @PTEST_NAME@.sav LOG @PTEST_NAME@_sav.res LOG @PTEST_NAME@_sav.err @frama-c@ -eva @EVA_OPTIONS@ -out -input -deps @PTEST_FILE@ -save @PTEST_NAME@.sav > @PTEST_NAME@_sav.res 2> @PTEST_NAME@_sav.err MODULE: segfault_datatypes_B - STDOPT: +"-load %{dep:@PTEST_RESULT@/segfault_datatypes.sav} -eva -out -input -deps" + STDOPT: +"-load %{dep:@PTEST_NAME@.sav} -eva -out -input -deps" */ int main() { diff --git a/tests/saveload/sparecode.i b/tests/saveload/sparecode.i index 933cb8cb8de234563c6dea164eb9193a7df0ab87..ffa780633e0759e832e1e61242c69103dcd8f3a8 100644 --- a/tests/saveload/sparecode.i +++ b/tests/saveload/sparecode.i @@ -1,7 +1,9 @@ /* run.config + COMMENT: the following CMD redefinition omits adding @PTEST_FILE@ on purpose (due to -load) + CMD: @frama-c@ @PTEST_OPTIONS@ PLUGIN: @EVA_PLUGINS@ slicing - EXECNOW: BIN sparecode.sav LOG sparecode_sav.res LOG sparecode_sav.err @frama-c@ -slicing-level 2 -slice-return main -eva-show-progress -save @PTEST_RESULT@/sparecode.sav %{dep:@PTEST_DIR@/sparecode.i} -then-on 'Slicing export' -print > @PTEST_RESULT@/sparecode_sav.res 2> @PTEST_RESULT@/sparecode_sav.err - STDOPT: +"-load %{dep:@PTEST_RESULT@/sparecode.sav}" + EXECNOW: BIN @PTEST_NAME@.sav LOG @PTEST_NAME@_sav.res LOG @PTEST_NAME@_sav.err @frama-c@ -slicing-level 2 -slice-return main -eva-show-progress -save @PTEST_NAME@.sav @PTEST_FILE@ -then-on 'Slicing export' -print > @PTEST_NAME@_sav.res 2> @PTEST_NAME@_sav.err + STDOPT: +"-load %{dep:@PTEST_NAME@.sav}" */ int G; int f (int x, int y) { diff --git "a/tests/syntax/foo\".c" "b/tests/syntax/foo\".c" index ce59b28345e86bf469a7f6d7915472e9c1129424..51ab7db036515eb4dff56be6116636cdf2137280 100644 --- "a/tests/syntax/foo\".c" +++ "b/tests/syntax/foo\".c" @@ -1,13 +1,7 @@ -<<<<<<< HEAD /* run.config* DONTRUN: */ #include "assert.h" -||||||| 754e522ceb -#include "share/libc/assert.h" -======= -#include "assert.h" ->>>>>>> origin/master int test = 1; diff --git a/tests/syntax/oracle/char_is_unsigned.res.oracle b/tests/syntax/oracle/char_is_unsigned.res.oracle index cda585a0ee04d21af96c30758401fdc4b7c3c4b2..5486dee5ffefeb44b565c80c0799da3021a9b204 100644 --- a/tests/syntax/oracle/char_is_unsigned.res.oracle +++ b/tests/syntax/oracle/char_is_unsigned.res.oracle @@ -10,7 +10,7 @@ void main(void) [kernel] Parsing char_is_unsigned.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main /* Generated by Frama-C */ char t[10]; void main(void) diff --git a/tests/syntax/oracle/check_builtin_bts1440.res.oracle b/tests/syntax/oracle/check_builtin_bts1440.res.oracle index 653ae8b9d4372589488a1ec1e37a4a5c555a5465..32d925b4bfe4c3c97c19d67815d1f978afa4b0b1 100644 --- a/tests/syntax/oracle/check_builtin_bts1440.res.oracle +++ b/tests/syntax/oracle/check_builtin_bts1440.res.oracle @@ -915,8 +915,6 @@ unsigned char __sync_sub_and_fetch_uint8_t(unsigned char volatile *__x0, unsigned char __x1 , ...); - void __sync_synchronize(...); - short __sync_val_compare_and_swap_int16_t(short volatile *__x0, short __x1, short __x2 , ...); diff --git a/tests/syntax/oracle/struct_with_invalid_field.0.res.oracle b/tests/syntax/oracle/struct_with_invalid_field.0.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..4babdfba70bb34026e442c04b29f88f77df5a53e --- /dev/null +++ b/tests/syntax/oracle/struct_with_invalid_field.0.res.oracle @@ -0,0 +1,3 @@ +[kernel] Parsing struct_with_invalid_field.c (with preprocessing) +/* Generated by Frama-C */ + diff --git a/tests/syntax/oracle/struct_with_invalid_field.1.res.oracle b/tests/syntax/oracle/struct_with_invalid_field.1.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..08f35f292b14547a0bb6cb2273643c590c685e9f --- /dev/null +++ b/tests/syntax/oracle/struct_with_invalid_field.1.res.oracle @@ -0,0 +1,6 @@ +[kernel] Parsing struct_with_invalid_field.c (with preprocessing) +[kernel] struct_with_invalid_field.c:13: User Error: + field `f' declared as a function +[kernel] User Error: stopping on file "struct_with_invalid_field.c" that has errors. Add + '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/struct_with_invalid_field.2.res.oracle b/tests/syntax/oracle/struct_with_invalid_field.2.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..74ab8ae4929831eabb086c70a64621a0a51abc77 --- /dev/null +++ b/tests/syntax/oracle/struct_with_invalid_field.2.res.oracle @@ -0,0 +1,6 @@ +[kernel] Parsing struct_with_invalid_field.c (with preprocessing) +[kernel] struct_with_invalid_field.c:21: User Error: + negative bitfield width (-1) +[kernel] User Error: stopping on file "struct_with_invalid_field.c" that has errors. Add + '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/struct_with_invalid_field.3.res.oracle b/tests/syntax/oracle/struct_with_invalid_field.3.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..9f48a481b14d8c7fa5a5e78205a394a884da326d --- /dev/null +++ b/tests/syntax/oracle/struct_with_invalid_field.3.res.oracle @@ -0,0 +1,6 @@ +[kernel] Parsing struct_with_invalid_field.c (with preprocessing) +[kernel] struct_with_invalid_field.c:24: User Error: + negative bitfield width (-2147483648) +[kernel] User Error: stopping on file "struct_with_invalid_field.c" that has errors. Add + '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/struct_with_invalid_field.4.res.oracle b/tests/syntax/oracle/struct_with_invalid_field.4.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..b1712e7f4e0211385f08c79380d7d19887ef3f4c --- /dev/null +++ b/tests/syntax/oracle/struct_with_invalid_field.4.res.oracle @@ -0,0 +1,6 @@ +[kernel] Parsing struct_with_invalid_field.c (with preprocessing) +[kernel] struct_with_invalid_field.c:27: User Error: + named bitfield (d) with zero width +[kernel] User Error: stopping on file "struct_with_invalid_field.c" that has errors. Add + '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/struct_with_invalid_field.res.oracle b/tests/syntax/oracle/struct_with_invalid_field.res.oracle deleted file mode 100644 index dd110c6d7c9d94c4d9dc3ef3b40edfa622c837cc..0000000000000000000000000000000000000000 --- a/tests/syntax/oracle/struct_with_invalid_field.res.oracle +++ /dev/null @@ -1,9 +0,0 @@ -[kernel] Parsing struct_with_invalid_field.i (no preprocessing) -[kernel] struct_with_invalid_field.i:8: User Error: - field `f' declared as a function -[kernel] struct_with_invalid_field.i:14: User Error: - negative bitfield width (-1) -[kernel] struct_with_invalid_field.i:15: User Error: - negative bitfield width (-2147483648) -[kernel] User Error: stopping on file "struct_with_invalid_field.i" that has errors. -[kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/unnamed_bitfields.0.res.oracle b/tests/syntax/oracle/unnamed_bitfields.0.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..6df296791c5eceade728f06428a3bac31f330470 --- /dev/null +++ b/tests/syntax/oracle/unnamed_bitfields.0.res.oracle @@ -0,0 +1 @@ +[kernel] Parsing unnamed_bitfields.c (with preprocessing) diff --git a/tests/syntax/oracle/unnamed_bitfields.1.res.oracle b/tests/syntax/oracle/unnamed_bitfields.1.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..7e979a78da83b634c71c301194a1088e2b259f8f --- /dev/null +++ b/tests/syntax/oracle/unnamed_bitfields.1.res.oracle @@ -0,0 +1,6 @@ +[kernel] Parsing unnamed_bitfields.c (with preprocessing) +[kernel] unnamed_bitfields.c:18: User Error: + named bitfield (zero_with_name) with zero width +[kernel] User Error: stopping on file "unnamed_bitfields.c" that has errors. Add + '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/unnamed_bitfields.res.oracle b/tests/syntax/oracle/unnamed_bitfields.res.oracle deleted file mode 100644 index 89cfeea2854f55cd70a8c0554f5bdccfaf2bb952..0000000000000000000000000000000000000000 --- a/tests/syntax/oracle/unnamed_bitfields.res.oracle +++ /dev/null @@ -1,18 +0,0 @@ -[kernel] Parsing unnamed_bitfields.i (no preprocessing) -/* Generated by Frama-C */ -struct foo { - unsigned int bar : 16 ; - unsigned int : 0 ; - unsigned int bla : 11 ; - unsigned int : 1 ; - unsigned int bli : 4 ; - unsigned int : 0 ; -}; -unsigned int f(struct foo s) -{ - unsigned int __retres; - __retres = (unsigned int)s.bla; - return __retres; -} - - diff --git a/tests/syntax/oracle/very_large_integers.0.res.oracle b/tests/syntax/oracle/very_large_integers.0.res.oracle index db47193a76d6e1bfe1ae750ac1ab111463eb03be..1236cc7d7251b2e8c568575ebd87c1f5fe81ecbc 100644 --- a/tests/syntax/oracle/very_large_integers.0.res.oracle +++ b/tests/syntax/oracle/very_large_integers.0.res.oracle @@ -1,13 +1,8 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:23: User Error: +[kernel] very_large_integers.c:25: User Error: integer constant too large in expression (unsigned long long)999999999999999999 + 9999999999999999999 -[kernel] very_large_integers.c:24: User Error: +[kernel] very_large_integers.c:26: User Error: bitfield width is not a valid integer constant -[kernel] very_large_integers.c:72: Warning: - ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:72: Warning: - ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ - (9223372036854775808) ) [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.1.res.oracle b/tests/syntax/oracle/very_large_integers.1.res.oracle index 307887ca5d2b21c81d4219ce0aff720be6d45899..0ceeff36ccde04c3d61ff573c96102096722534f 100644 --- a/tests/syntax/oracle/very_large_integers.1.res.oracle +++ b/tests/syntax/oracle/very_large_integers.1.res.oracle @@ -1,11 +1,11 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:30: User Error: +[kernel] very_large_integers.c:32: User Error: Cannot represent the integer 99999999999999999999U -[kernel] very_large_integers.c:30: User Error: +[kernel] very_large_integers.c:32: User Error: Cannot represent the integer 99999999999999999999U -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add diff --git a/tests/syntax/oracle/very_large_integers.10.res.oracle b/tests/syntax/oracle/very_large_integers.10.res.oracle index 12b104249f7108e741dbdcbaf168b0c5e4e460c8..468e5fb2083acf41ff3217f2eb0a4afcbb5e4412 100644 --- a/tests/syntax/oracle/very_large_integers.10.res.oracle +++ b/tests/syntax/oracle/very_large_integers.10.res.oracle @@ -1,10 +1,10 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) -[kernel] very_large_integers.c:85: Failure: +[kernel] very_large_integers.c:87: Failure: Invalid digit 9 in integer literal '09876543210' in base 8. [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. diff --git a/tests/syntax/oracle/very_large_integers.11.res.oracle b/tests/syntax/oracle/very_large_integers.11.res.oracle index 475579421115b3243ca7789a42b46a43b5ad8efc..c0fab3ffc4147ea4527558d6d2590660893ad8cf 100644 --- a/tests/syntax/oracle/very_large_integers.11.res.oracle +++ b/tests/syntax/oracle/very_large_integers.11.res.oracle @@ -1,19 +1,19 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) -[kernel:annot-error] very_large_integers.c:94: Warning: +[kernel:annot-error] very_large_integers.c:114: Warning: Invalid slevel directive. Ignoring code annotation [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed [eva:initial-state] Values of globals at initialization nondet ∈ [--..--] -[kernel:annot-error] very_large_integers.c:91: Warning: +[kernel:annot-error] very_large_integers.c:111: Warning: invalid loop unrolling parameter; ignoring -[kernel:annot-error] very_large_integers.c:93: Warning: +[kernel:annot-error] very_large_integers.c:113: Warning: invalid loop unrolling parameter; ignoring [eva] done for function main [eva] ====== VALUES COMPUTED ====== diff --git a/tests/syntax/oracle/very_large_integers.12.res.oracle b/tests/syntax/oracle/very_large_integers.12.res.oracle index bfe4d557fd5884566eae8264163769c4f9568f84..71f4141e2feac45abe01a04d0e72485ae2fbbfda 100644 --- a/tests/syntax/oracle/very_large_integers.12.res.oracle +++ b/tests/syntax/oracle/very_large_integers.12.res.oracle @@ -1,10 +1,10 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) -[kernel] very_large_integers.c:98: User Error: +[kernel] very_large_integers.c:118: User Error: Invalid digit 9 in integer literal '09' in base 8. [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. diff --git a/tests/syntax/oracle/very_large_integers.13.res.oracle b/tests/syntax/oracle/very_large_integers.13.res.oracle index 2ae16ad88a397319ee4843017e4b397a22b8b1ca..3d0eb837dc4c63ebeadb4d593353cddca2ad52dd 100644 --- a/tests/syntax/oracle/very_large_integers.13.res.oracle +++ b/tests/syntax/oracle/very_large_integers.13.res.oracle @@ -1,22 +1,11 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) -[kernel] very_large_integers.c:103: Warning: - ignoring unrolling directive (not an understood constant expression) -/* Generated by Frama-C */ -int volatile nondet; -/*@ logic ℤ too_large_integer= 9999999999999999999; - */ -int main(void) -{ - int __retres; - /*@ loop pragma UNROLL 99999999999999999999; */ - while (nondet) ; - __retres = 0; - return __retres; -} - - +[kernel] very_large_integers.c:92: User Error: + array length too large: 72057594037927937 +[kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add + '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.14.res.oracle b/tests/syntax/oracle/very_large_integers.14.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..d404452dfd895f433aa72dea49482f99e8643a49 --- /dev/null +++ b/tests/syntax/oracle/very_large_integers.14.res.oracle @@ -0,0 +1,11 @@ +[kernel] Parsing very_large_integers.c (with preprocessing) +[kernel] very_large_integers.c:74: Warning: + ignoring invalid aligned attribute: __aligned__(9223372036854775808) +[kernel] very_large_integers.c:74: Warning: + ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ + (9223372036854775808) ) +[kernel] very_large_integers.c:103: User Error: + array length too large: 7205759403792794 +[kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add + '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.15.res.oracle b/tests/syntax/oracle/very_large_integers.15.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..dc363357b8e0127f7ae9529b4746e8c6280c06d0 --- /dev/null +++ b/tests/syntax/oracle/very_large_integers.15.res.oracle @@ -0,0 +1,22 @@ +[kernel] Parsing very_large_integers.c (with preprocessing) +[kernel] very_large_integers.c:74: Warning: + ignoring invalid aligned attribute: __aligned__(9223372036854775808) +[kernel] very_large_integers.c:74: Warning: + ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ + (9223372036854775808) ) +[kernel] very_large_integers.c:123: Warning: + ignoring unrolling directive (not an understood constant expression) +/* Generated by Frama-C */ +int volatile nondet; +/*@ logic ℤ too_large_integer= 9999999999999999999; + */ +int main(void) +{ + int __retres; + /*@ loop pragma UNROLL 99999999999999999999; */ + while (nondet) ; + __retres = 0; + return __retres; +} + + diff --git a/tests/syntax/oracle/very_large_integers.2.res.oracle b/tests/syntax/oracle/very_large_integers.2.res.oracle index e66ed1591681d53e53f404a32095556d54bd2cf0..1b64027503125bcc49fc9d4599971c336cfb15b1 100644 --- a/tests/syntax/oracle/very_large_integers.2.res.oracle +++ b/tests/syntax/oracle/very_large_integers.2.res.oracle @@ -1,7 +1,7 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:37: User Error: +[kernel] very_large_integers.c:39: User Error: integer constant too large in expression 9999999999999999999U -[kernel] very_large_integers.c:37: Failure: +[kernel] very_large_integers.c:39: Failure: Cannot understand the constants in case range [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. diff --git a/tests/syntax/oracle/very_large_integers.3.res.oracle b/tests/syntax/oracle/very_large_integers.3.res.oracle index e98fe85d7ff380c6be85e8ce79137c9709721ddf..09f3e166f6fc16b424d6b82504c8e6acbd5ba5c2 100644 --- a/tests/syntax/oracle/very_large_integers.3.res.oracle +++ b/tests/syntax/oracle/very_large_integers.3.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:45: Failure: Case range too large +[kernel] very_large_integers.c:47: Failure: Case range too large [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.4.res.oracle b/tests/syntax/oracle/very_large_integers.4.res.oracle index 5af290bef311d47b04e339ebb7247767c84c5d15..b4a00ef7aed6589641454c16903b943c79833606 100644 --- a/tests/syntax/oracle/very_large_integers.4.res.oracle +++ b/tests/syntax/oracle/very_large_integers.4.res.oracle @@ -1,6 +1,6 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:50: Failure: - Array length 9999999999999999999U is not a compile-time constant: no explicit initializer allowed. +[kernel] very_large_integers.c:52: User Error: + Array length 9999999999999999999U is too big: no explicit initializer allowed. [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.5.res.oracle b/tests/syntax/oracle/very_large_integers.5.res.oracle index 5dbd30727bd1b94363fb985f0185ba755e8d10a9..e38af09ec48d06731752da54ed19b9dcfb554195 100644 --- a/tests/syntax/oracle/very_large_integers.5.res.oracle +++ b/tests/syntax/oracle/very_large_integers.5.res.oracle @@ -1,12 +1,12 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:54: User Error: +[kernel] very_large_integers.c:56: User Error: INDEX initialization designator overflows - 52 - 53 #ifdef INIT_DESIGNATOR2 - 54 int arr3[1] = { [9999999999999999999U] = 42 }; + 54 + 55 #ifdef INIT_DESIGNATOR2 + 56 int arr3[1] = { [9999999999999999999U] = 42 }; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 55 #endif - 56 + 57 #endif + 58 [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.6.res.oracle b/tests/syntax/oracle/very_large_integers.6.res.oracle index 8b2be7f122e514e8fef4b2dd02ab1b20fb1937d6..dd10e931b3a969b30c76a65f4809e6a6cc45855e 100644 --- a/tests/syntax/oracle/very_large_integers.6.res.oracle +++ b/tests/syntax/oracle/very_large_integers.6.res.oracle @@ -1,9 +1,9 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:58: User Error: +[kernel] very_large_integers.c:60: User Error: integer constant too large in expression -9999999999999999999U -[kernel] very_large_integers.c:58: User Error: +[kernel] very_large_integers.c:60: User Error: integer constant too large in expression 9999999999999999999U -[kernel] very_large_integers.c:58: Failure: +[kernel] very_large_integers.c:60: Failure: INDEX_RANGE initialization designator is not a valid constant [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. diff --git a/tests/syntax/oracle/very_large_integers.7.res.oracle b/tests/syntax/oracle/very_large_integers.7.res.oracle index 90e6c755d4504902ac707708502a65d7b2f87c07..406e636f4628df47d7cbd15e4cb0569b412feddc 100644 --- a/tests/syntax/oracle/very_large_integers.7.res.oracle +++ b/tests/syntax/oracle/very_large_integers.7.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:62: Failure: INDEX_RANGE too large +[kernel] very_large_integers.c:64: Failure: INDEX_RANGE too large [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.8.res.oracle b/tests/syntax/oracle/very_large_integers.8.res.oracle index 5eae6db9af1673c5803806b309d729f9b543b668..8de4f1b1a653361bea91ef257e180702797f46ce 100644 --- a/tests/syntax/oracle/very_large_integers.8.res.oracle +++ b/tests/syntax/oracle/very_large_integers.8.res.oracle @@ -1,9 +1,9 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:67: User Error: +[kernel] very_large_integers.c:69: User Error: Invalid attribute constant: 0x80000000000000000 -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add diff --git a/tests/syntax/oracle/very_large_integers.9.res.oracle b/tests/syntax/oracle/very_large_integers.9.res.oracle index e1237274ec9f58c32d41c55492aafb860b7ff0f8..fb843772ce75ca63700e1629a728e82e4f660024 100644 --- a/tests/syntax/oracle/very_large_integers.9.res.oracle +++ b/tests/syntax/oracle/very_large_integers.9.res.oracle @@ -1,7 +1,7 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:72: Warning: +[kernel] very_large_integers.c:74: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) [kernel] Failure: Cannot represent logical integer in C: 9999999999999999999 diff --git a/tests/syntax/struct_with_invalid_field.c b/tests/syntax/struct_with_invalid_field.c new file mode 100644 index 0000000000000000000000000000000000000000..527c15e35e09fab00562f15130b246cf8888b027 --- /dev/null +++ b/tests/syntax/struct_with_invalid_field.c @@ -0,0 +1,30 @@ +/* run.config* + STDOPT: + EXIT: 1 + STDOPT: #"-cpp-extra-args=-DFUNTYPE" + STDOPT: #"-cpp-extra-args=-DNEG1" + STDOPT: #"-cpp-extra-args=-DNEG2" + STDOPT: #"-cpp-extra-args=-DNAMEDZERO" +*/ + +#ifdef FUNTYPE +// invalid field with function type, parsing should fail +struct { + void f(int); +} s; +#endif + +// negative-width bitfields, parsing should fail +struct neg_bf +{ +#ifdef NEG1 + int a:(-1); // invalid +#endif +#ifdef NEG2 + int b:(-2147483647-1); // invalid +#endif +#ifdef NAMEDZERO + int d:(-0); // invalid (named zero-width) +#endif + int :(-0); // valid (unnamed zero-width) +}; diff --git a/tests/syntax/struct_with_invalid_field.i b/tests/syntax/struct_with_invalid_field.i deleted file mode 100644 index c1c4e15224e7da9d063a5618975c1f6c14823de1..0000000000000000000000000000000000000000 --- a/tests/syntax/struct_with_invalid_field.i +++ /dev/null @@ -1,17 +0,0 @@ -/* run.config* - EXIT: 1 - STDOPT: -*/ - -// invalid field with function type, parsing should fail -struct { - void f(int); -} s; - -// negative-width bitfields, parsing should fail -struct neg_bf -{ - int a:(-1); // invalid - int b:(-2147483647-1); // invalid - int d:(-0); // valid -}; diff --git a/tests/syntax/unnamed_bitfields.c b/tests/syntax/unnamed_bitfields.c new file mode 100644 index 0000000000000000000000000000000000000000..6f999ad0a8ac91bca35a22d9ce50cf2cbc3b9a7a --- /dev/null +++ b/tests/syntax/unnamed_bitfields.c @@ -0,0 +1,23 @@ +/* run.config +OPT: +EXIT:1 +OPT: -cpp-extra-args="-DINVALID_ZERO_BF" + */ + +struct foo +{ + unsigned bar : 16, : 0; + unsigned bla : 11, : 1; + unsigned bli : 4, : 0; +}; + +#ifdef INVALID_ZERO_BF +struct invalid_foo +{ + unsigned first : 1; + unsigned zero_with_name: 0; + unsigned last : 2; +}; +#endif + +unsigned f(struct foo s) { return s.bla; } diff --git a/tests/syntax/unnamed_bitfields.i b/tests/syntax/unnamed_bitfields.i deleted file mode 100644 index 14e793c74ab38cbe87329bc9f89ec5693c4584a4..0000000000000000000000000000000000000000 --- a/tests/syntax/unnamed_bitfields.i +++ /dev/null @@ -1,8 +0,0 @@ -struct foo -{ - unsigned bar : 16, : 0; - unsigned bla : 11, : 1; - unsigned bli : 4, : 0; -}; - -unsigned f(struct foo s) { return s.bla; } diff --git a/tests/syntax/very_large_integers.c b/tests/syntax/very_large_integers.c index 5e31b993a90f21f75549692e59ffca2741a7310b..996c0ca0bf0ce2528d4ebb0cd4fe8801b4426e67 100644 --- a/tests/syntax/very_large_integers.c +++ b/tests/syntax/very_large_integers.c @@ -14,6 +14,8 @@ STDOPT: #"-cpp-extra-args=-DLOGIC_CONSTANT_OCTAL" STDOPT: #"-cpp-extra-args=-DEVA_UNROLL -eva -kernel-warn-key annot-error=error" STDOPT: #"-cpp-extra-args=-DCABS_DOWHILE" + STDOPT: #"-cpp-extra-args=-DARRAY_INIT1" + STDOPT: #"-cpp-extra-args=-DARRAY_INIT2" EXIT: 0 STDOPT: #"-cpp-extra-args=-DUNROLL_PRAGMA" */ @@ -85,6 +87,24 @@ typedef struct { //@ type too_large_logic_array_octal = int[09876543210]; #endif +#ifdef ARRAY_INIT1 +// Previously caused Invalid_argument(Array.make) +int a1[] = {[72057594037927936] = 0}; +#endif + +#ifdef ARRAY_INIT2 +struct arri2 { + int a[7205759403792795]; +}; +struct st { + struct arri2 a; +}; +// Previously caused Out of memory +struct st s = { + {{[7205759403792793 ... 7205759403792793] = 0}} +}; +#endif + int main() { #ifdef EVA_UNROLL //@ loop unroll (-9999999999999999999); // IntLimit diff --git a/tests/value/library.i b/tests/value/library.i index 797623ff33b77cc4ee483367070e4bf42c3cf926..a7de6191a45e32d95a96bfde962081c2891b47a3 100644 --- a/tests/value/library.i +++ b/tests/value/library.i @@ -60,7 +60,7 @@ void (*ff)(); struct { short bf1: 5; - short bf : 0; // 0-sized bitfield: do not attemp to initialize it + short : 0; // 0-sized bitfield: do not attempt to initialize it unsigned int control: 14, : 0; } s_bitfield; diff --git a/tests/value/memexec.c b/tests/value/memexec.c index bb6bb912db9935c2a1a631b9b398d127236419f3..e87602726a13efd85890a02ab97e39e205d27042 100644 --- a/tests/value/memexec.c +++ b/tests/value/memexec.c @@ -1,7 +1,7 @@ /* run.config* - STDOPT: +"-rte-select fbug @RTE_TEST@ -then -eva" + PLUGIN: @PTEST_PLUGIN@ rtegen + STDOPT: #"-machdep x86_32 -rte-select fbug @RTE_TEST@ -then -eva" */ - int x1, y1, z1, z2; volatile int c, nondet; void f11() { diff --git a/tests/value/oracle/div.1.res.oracle b/tests/value/oracle/div.1.res.oracle index 0410d4b23f408be62d1b069ae28107b86c9c52b0..14acaa30f17add47b1c80dc39a18c1e6821795d5 100644 --- a/tests/value/oracle/div.1.res.oracle +++ b/tests/value/oracle/div.1.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing div.i (no preprocessing) -[rte] annotating function main +[rte:annot] annotating function main [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed diff --git a/tests/value/oracle/extern.res.oracle b/tests/value/oracle/extern.res.oracle index 731cb592c363661e2c02429596b4a0254c5b429c..7fd64be0b6058acc2788224f41da4790c85d8988 100644 --- a/tests/value/oracle/extern.res.oracle +++ b/tests/value/oracle/extern.res.oracle @@ -7,7 +7,8 @@ [eva:unknown-size] extern.i:7: Warning: during initialization of variable 'T4', size of type 'int const []' cannot be computed (Size of array without number of elements.) -[eva] extern.i:16: no size specified for array, assuming 0 +[eva] extern.i:16: + problem with array size (not a compile-time constant), assuming 0 [eva] Initial state computed [eva:initial-state] Values of globals at initialization T1 ∈ [--..--] diff --git a/tests/value/oracle/initialized_copy.1.res.oracle b/tests/value/oracle/initialized_copy.1.res.oracle index 19688c6d03b07077e0e9af1053fcac4984df745d..99d71e0d2f64e832857ff211df6e48551bba6423 100644 --- a/tests/value/oracle/initialized_copy.1.res.oracle +++ b/tests/value/oracle/initialized_copy.1.res.oracle @@ -72,13 +72,8 @@ [eva] Recording results for f [eva] Done for function f [eva] initialized_copy.i:130: Frama_C_show_each_unreached: -[eva] computing for function g <- main. - Called from initialized_copy.i:135. -[kernel:annot:missing-spec] initialized_copy.i:135: Warning: - Neither code nor specification for function g, generating default assigns from the prototype -[eva] using specification for function g -[eva] Done for function g -[eva] initialized_copy.i:136: Frama_C_show_each_unreached: +[eva:alarm] initialized_copy.i:135: Warning: + accessing uninitialized left-value. assert \initialized(&a_6); [eva] computing for function f <- main. Called from initialized_copy.i:143. [eva] Recording results for f @@ -91,19 +86,26 @@ a_7 ∈ {1} or UNINITIALIZED __retres ∈ UNINITIALIZED ==END OF DUMP== +[eva:alarm] initialized_copy.i:151: Warning: + accessing uninitialized left-value. assert \initialized(&a_8); [eva] computing for function g <- main. Called from initialized_copy.i:151. +[kernel:annot:missing-spec] initialized_copy.i:151: Warning: + Neither code nor specification for function g, generating default assigns from the prototype +[eva] using specification for function g [eva] Done for function g [eva] initialized_copy.i:152: Frama_C_dump_each: # cvalue: w[0..9] ∈ {0; 12} or UNINITIALIZED v ∈ [--..--] - a_8 ∈ {1} or UNINITIALIZED + a_8 ∈ {1} __retres ∈ UNINITIALIZED ==END OF DUMP== [eva] Recording results for main [eva] done for function main +[eva] initialized_copy.i:135: + assertion 'Eva,initialization' got final status invalid. [eva] ====== VALUES COMPUTED ====== [eva:final-states] Values at end of function f: diff --git a/tests/value/oracle/memexec.res.oracle b/tests/value/oracle/memexec.res.oracle index 511142198071bebc75f405479ef9cf3727aa14b1..25be30c2f1d4750d002bdca947d2cf5702ae85e8 100644 --- a/tests/value/oracle/memexec.res.oracle +++ b/tests/value/oracle/memexec.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing memexec.c (with preprocessing) -[rte] annotating function fbug +[rte:annot] annotating function fbug [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed diff --git a/tests/value/oracle/precond2.0.res.oracle b/tests/value/oracle/precond2.0.res.oracle index 6b8ad90cb927b0c71e29751dc61f0a75149e1a23..10ee7cb691c71c333a96e0b869b71de6781c3e6c 100644 --- a/tests/value/oracle/precond2.0.res.oracle +++ b/tests/value/oracle/precond2.0.res.oracle @@ -1,6 +1,6 @@ [kernel] Parsing precond2.c (with preprocessing) -[rte] annotating function f -[rte] annotating function main +[rte:annot] annotating function f +[rte:annot] annotating function main [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed diff --git a/tests/value/oracle/precond2.1.res.oracle b/tests/value/oracle/precond2.1.res.oracle index 67f7eb22cc8357658ae476e157df49bc86a33825..4787a711af49ec5c93398aa4513386bbb9d207e3 100644 --- a/tests/value/oracle/precond2.1.res.oracle +++ b/tests/value/oracle/precond2.1.res.oracle @@ -35,8 +35,6 @@ x ∈ {1} [eva:final-states] Values at end of function main: x ∈ {0; 1} -[rte] annotating function f -[rte] annotating function main [report] Computing properties status... -------------------------------------------------------------------------------- diff --git a/tests/value/oracle/summary.4.res.oracle b/tests/value/oracle/summary.4.res.oracle index 0c3ad90376e8a418941025c371f3e29537a8b190..81eb244352197d5f99e3c7f35bb16ba46ccbe574 100644 --- a/tests/value/oracle/summary.4.res.oracle +++ b/tests/value/oracle/summary.4.res.oracle @@ -1,13 +1,13 @@ -[kernel] Warning: -slevel is a deprecated alias for option -eva-slevel. - Please use -eva-slevel instead. [kernel] Parsing summary.i (no preprocessing) -[rte] annotating function alarms -[rte] annotating function bottom +[rte:annot] annotating function alarms +[rte:annot] annotating function bottom [rte] summary.i:15: Warning: guaranteed RTE: assert division_by_zero: 0 ≢ 0; -[rte] annotating function dead -[rte] annotating function logic -[rte] annotating function main -[rte] annotating function minimal +[rte:annot] annotating function dead +[rte:annot] annotating function logic +[rte:annot] annotating function main +[rte:annot] annotating function minimal +[kernel] Warning: -slevel is a deprecated alias for option -eva-slevel. + Please use -eva-slevel instead. [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed @@ -107,7 +107,7 @@ ---------------------------------------------------------------------------- Some errors and warnings have been raised during the analysis: by the Eva analyzer: 0 errors 1 warning - by the Frama-C kernel: 0 errors 2 warnings + by the Frama-C kernel: 0 errors 3 warnings ---------------------------------------------------------------------------- 18 alarms generated by the analysis: 3 invalid memory accesses diff --git a/tests/value/oracle/unknown_sizeof.0.res.oracle b/tests/value/oracle/unknown_sizeof.0.res.oracle index b106b41c0ed6f8b83419377598478fedd74bcbfe..4244ff0a82bf4d678680de7005b49eb33ba7e264 100644 --- a/tests/value/oracle/unknown_sizeof.0.res.oracle +++ b/tests/value/oracle/unknown_sizeof.0.res.oracle @@ -1,4 +1,5 @@ [kernel] Parsing unknown_sizeof.i (no preprocessing) +[eva] Warning: The inout plugin is missing: some features are disabled, and the analysis may have degraded precision and performance. [eva] Analyzing a complete application starting at main1 [eva] Computing initial state [eva:unknown-size] unknown_sizeof.i:8: Warning: diff --git a/tests/value/oracle/unknown_sizeof.1.res.oracle b/tests/value/oracle/unknown_sizeof.1.res.oracle index 52d022abfce0070deb7ef6ef3f21e519c7411d0a..fd9e82d2f78f1e71419051cac7ceafad4710390f 100644 --- a/tests/value/oracle/unknown_sizeof.1.res.oracle +++ b/tests/value/oracle/unknown_sizeof.1.res.oracle @@ -1,4 +1,5 @@ [kernel] Parsing unknown_sizeof.i (no preprocessing) +[eva] Warning: The inout plugin is missing: some features are disabled, and the analysis may have degraded precision and performance. [eva] Analyzing a complete application starting at main2 [eva] Computing initial state [eva:unknown-size] unknown_sizeof.i:8: Warning: diff --git a/tests/value/summary.i b/tests/value/summary.i index 718f105808a8e7a74784f387e3945490e35f5f0b..3ef6022672e965f17208f8baaf7385d8cfc54c8b 100644 --- a/tests/value/summary.i +++ b/tests/value/summary.i @@ -3,8 +3,8 @@ STDOPT: +"-eva-msg-key=summary -main minimal" STDOPT: +"-eva-msg-key=summary -main bottom" STDOPT: +"-eva-msg-key=summary -main main" -PLUGIN: @PTEST_PLUGIN@ rtegen - STDOPT: +"@RTE_TEST@ -eva-msg-key=summary -main main -slevel 0" + PLUGIN: @PTEST_PLUGIN@ rtegen + OPT: -machdep x86_32 @RTE_TEST@ -then @EVA_TEST@ -eva-msg-key=summary -main main -slevel 0 */ /* Tests the summary on the smallest possible program. */ void minimalist ();